std :: optional的最佳替代方法是从方法返回可选值吗?(使用C++ 98/C++ 11/C++ 14)

mr_*_*r_T 24 c++ return-value optional c++11

显然,std::optional如果使用C++ 17或boost,则从函数返回可选值是最佳选择(另请参阅GOTW#90)

std::optional<double> possiblyFailingCalculation()
Run Code Online (Sandbox Code Playgroud)

但是,如果一个人坚持使用旧版本(并且不能使用提升),那么什么以及为什么会是最好的选择呢?

我看到几个选项:

  1. STL智能指针(仅限C++ 11)

    std::unique_ptr<double> possiblyFailingCalculation();
    
    Run Code Online (Sandbox Code Playgroud)
    • (+)几乎与可选的用法相同
    • ( - )混淆智能指针指向非多态类型或内置类型
  2. 将它与bool配对

    std::pair<double,bool> possiblyFailingCalculation();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 老式

    bool possiblyFailingCalculation(double& output);
    
    Run Code Online (Sandbox Code Playgroud)
    • ( - )与新的C++ 11 auto value = calculation() 样式不兼容
  4. 一个DIY模板:一个具有相同功能的基本模板很容易编码,但是实现一个健壮的std::optional<T>外观模板是否有任何陷阱?

  5. 抛出一个例外

    • ( - )有时"无法计算"是有效的返回值.

Bar*_*rry 23

std::optional和它的boost::optional父母一样,是一个非常基本的类模板.它是一个bool存储,一些便利成员函数,其中大多数是一行代码和一个断言.

DIY选项绝对是首选.(1)涉及分配和(2),(3)涉及必须构建一个T即使你想要一个空值 - 这根本不重要,double但对更昂贵的类型也很重要.对于(5),例外不是替代optional.

您始终可以将您的实施与Boost进行比较.毕竟,它只是一个小型的标题库.

  • @Yehonal你真的读过答案吗? (5认同)