在 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::optional
或 std::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::optional
或 std::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 ...