显然, std::optional
如果使用 C++17 或 boost 从函数返回可选值的最佳选择(另见 GOTW #90 )
std::optional<double> possiblyFailingCalculation()
但是,如果一个人坚持使用旧版本(并且不能使用 boost),那么最好的选择是什么,为什么是最好的选择?
我看到几个选项:
- STL 智能指针(仅限 C++11)
std::unique_ptr<double> possiblyFailingCalculation();
- (+) 与 optional 几乎相同的用法
- (−) 对非多态类型或内置类型的智能指针感到困惑
- 与布尔配对
std::pair<double,bool> possiblyFailingCalculation();
- 老式
bool possiblyFailingCalculation(double& output);
- (−) 与新的 C++11
auto value = calculation()
风格不兼容
DIY 模板:具有相同功能的基本模板很容易编写代码,但是在实现强大的
std::optional<T>
类似模板时是否存在任何缺陷?抛出异常
- (−) 有时“无法计算”是一个有效的返回值。
原文由 mr_T 发布,翻译遵循 CC BY-SA 4.0 许可协议
std::optional
与其boost::optional
父级一样,是一个非常基本的类模板。它是一个bool
,一些存储和一堆方便的成员函数,其中大部分是一行代码和一个断言。DIY 选项绝对是首选。 (1) 涉及分配和 (2)、(3) 涉及必须构造一个
T
即使您想要一个空值 - 这对于double
根本不重要,但确实对于更昂贵的类型来说很重要。对于 (5),例外不能替代optional
。您始终可以将您的实现与 Boost 的实现进行比较。毕竟,这是一个小型的仅标头库。