在不使用 optional<T>{} from BOOST library
的情况下,在 C++ 中返回泛型可选的另一种方法是什么?
例子
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("not found"); 为字符串
返回nullprt;指针类型
但这违背了通用的目的。必须有另一种方式吗? 感谢您的帮助
最佳答案
首先,boost::optional
或 std::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 );
请注意,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 ...
关于c++ - 从 C++ 中的泛型函数返回可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42016879/