什么是在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 ?<---
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,如果我知道最常见的类型,我可以称之为这个功能
返回T(-1); 对于int
返回T("未找到"); 对于字符串
return nullprt; 用于指针类型
但这就失败了通用的目的.必须有另一种方式吗?谢谢你的帮助
首先,boost::optional或std::optional完全针对该案例.你有什么理由不想使用它们吗?因为大多数解决方案都会模仿,std::optional或者它们是一个糟糕的替代品.
template <class T>
bool search( T arg, T & out );
Run Code Online (Sandbox Code Playgroud)
返回是否已将结果写入out.这可能是一个糟糕的替代品,因为它需要调用者构造一个类型的对象T.如果调用者本身是通用的,那么T要么必须是默认可构造的,要么传递给调用者本身.
template <class T>
const T & search( T arg );
Run Code Online (Sandbox Code Playgroud)
可以替换为
template <class T>
const T * search( T arg );
Run Code Online (Sandbox Code Playgroud)
请注意,这std::optional不支持相同程度的引用boost::optional,因此在使用时std::optional,您可能会在处理引用时回到此处.
我不推荐这个.如果你想做得对,你必须考虑很多.如果你能忍受boost::optional或者std::optional(特别是关于线程安全)的限制,我看不出你应该这样做的原因.
再次阅读您的问题,您考虑将虚拟值保留在地图中.我不建议这样做,因为很明显,它不那么通用,我看不到任何好处.但是关于地图,你会有一个提供虚拟值的类型特征:
template <class T>
struct DummyValue;
template <>
struct DummyValue<int>
{
static constexpr const int value = -1;
// Or:
// static int makeDummyValue();
};
// And so on ...
Run Code Online (Sandbox Code Playgroud)