在 C++ 中返回泛型可选的另一种方法是什么,而不使用 optional<T>{} from BOOST library
例子

 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 ?<---
    }

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

返回 T(-1); 用于 int

return T("未找到"); 用于字符串

返回 nullprt; 用于指针类型

但这违背了泛型的目的。一定有别的办法吧?
谢谢你的帮助

最佳答案

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

通过引用传递输出参数。

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

返回是否已将结果写出。这可能是一个糟糕的替代方案,因为它需要调用者构造一个 T 类型的对象。如果调用者本身是通用的,那么 T 要么必须是默认构造的,要么传递给调用者本身。

如果您通常会返回一个引用,请改为返回一个指针。
template <class T>
const T & search( T arg );

可以替换为
template <class T>
const T * search( T arg );

请注意, std::optional 不支持与 boost::optional 相同程度的引用,因此在使用 std::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 ...

10-08 08:34
查看更多