在C++中从通用函数返回可选值

4

有没有其他方法可以在C++中返回通用的可选项,而不使用BOOST库中的optional<T>{}?

示例

 template<class T>
    T search(T arg) {
        // this function is just to show the idea of what I am trying to ac
       if (found) return arg;
       return ?<---
    }

我的意思是,如果我知道调用这个函数的最常见类型,我可以:

对于int类型,返回T(-1);

对于string类型,返回T("not found");

对于指针类型,返回nullptr;

但这样做会破坏泛型的目的。一定还有其他方法对吧?谢谢你的帮助。


现有设施怎么可能知道每种类型的好默认值呢? - chris
你是指三个返回值的例子吗? - mello
是的,听起来你想要一个通用的版本。 - chris
是的先生,我甚至考虑将这些返回值放在某个字典中,然后检测传递给特定键的返回值的类型。 - mello
2
然而,您不可能为每种类型都这样做。我在您的通用代码之后编写了自己的类型。它甚至不知道如何构造我的类型的对象,更不用说构造一个合理的返回对象了。 - chris
1个回答

9
首先,boost::optionalstd::optional正是为这种情况而制作的。你不想使用它们的原因是什么?因为大多数解决方案要么模仿std::optional,要么是一个糟糕的替代品。

通过引用传递输出参数。

template <class T>
bool search( T arg, T & out );

返回是否已将结果写入out。这可能是一个较差的替代方法,因为它要求调用者构造类型为T的对象。如果调用者本身是通用的,则T必须具有默认构造或传递给调用者本身。

如果通常会返回引用,请返回指针。

template <class T>
const T & search( T arg );

可以替换为

template <class T>
const T * search( T arg );

请注意,与boost::optional相比,std::optional不支持引用的使用,因此当使用std::optional时,在处理引用时可能需要退回到旧方法。

自己编写 optional。

我不建议这样做。如果想做对的话,你必须认真考虑。如果可以接受boost::optionalstd::optional的限制(特别是线程安全方面),我看不出为什么要自己编写一个。

拥有提供虚值的类型特征。

重新阅读您的问题后,您考虑在map中保留虚值。我不推荐这样做,因为这显然不太通用,我看不到任何好处。但是针对map,您可以使用类型特征来提供虚值:
template <class T>
struct DummyValue;

template <>
struct DummyValue<int>
{
    static constexpr const int value = -1;
    // Or:
    // static int makeDummyValue();
};
// And so on ...

你说得对...可选库,哈哈...谢谢解释...伙计们,他们需要将std::optional与C++一起发布。 - mello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接