在不使用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
返回T(&#34;未找到&#34;); 表示字符串
对于指针类型,返回nullprt;
但那失败了通用的目的。必须有另一种方式吗? 谢谢你的帮助
答案 0 :(得分:9)
首先,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
的约束(特别是关于线程安全性),我看不出您应该这样做的原因。
再次阅读您的问题,您考虑过在地图中保留虚拟值。我不建议这样做,因为很明显,它不那么通用,我看不到任何好处。但是关于地图,你会有一个提供虚拟值的类型特征:
template <class T>
struct DummyValue;
template <>
struct DummyValue<int>
{
static constexpr const int value = -1;
// Or:
// static int makeDummyValue();
};
// And so on ...