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

标签 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

return T("not found"); 为字符串

返回nullprt;指针类型

但这违背了通用的目的。必须有另一种方式吗? 感谢您的帮助

最佳答案

首先,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 的约束(特别是关于线程安全),我看不出您应该这样做的理由这个。

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

再次阅读您的问题,您考虑过在 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/

相关文章:

c++ - QMediaPlayer duration() 总是返回 0

c++ - 我是 RUBY 的新手,我需要了解 3 个函数

c++ - 在泛型类之外定义函数会产生编译错误

c++ - 解析模板和 const volatile 类型

java - 哪些模板语言可同时用于 Java 和 Javascript?

c++ - CMake 将多个子项目构建到一个目录中

C++ 析构函数调用了错误的对象?

c++ - 如何使用模板创建多维 std::array?

c++ - ios 无法识别

c++ - 如何从模板类型中获取指向模板化成员函数的指针?