从c ++中的泛型函数返回可选项

时间:2017-02-03 04:38:59

标签: c++ templates

在不使用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

返回T(&#34;未找到&#34;); 表示字符串

对于指针类型

返回nullprt;

但那失败了通用的目的。必须有另一种方式吗? 谢谢你的帮助

1 个答案:

答案 0 :(得分:9)

首先,boost::optionalstd::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::optionalstd::optional的约束(特别是关于线程安全性),我看不出您应该这样做的原因。

具有提供虚拟值的类型特征。

再次阅读您的问题,您考虑过在地图中保留虚拟值。我不建议这样做,因为很明显,它不那么通用,我看不到任何好处。但是关于地图,你会有一个提供虚拟值的类型特征:

template <class T>
struct DummyValue;

template <>
struct DummyValue<int>
{
    static constexpr const int value = -1;
    // Or:
    // static int makeDummyValue();
};
// And so on ...