明显地,std::optional
如果使用 C++17 或 boost,则这是从函数返回可选值的最佳选择(另请参阅GOTW #90 http://herbsutter.com/2013/05/30/gotw-90-solution-factories/)
std::optional<double> possiblyFailingCalculation()
但是,如果用户坚持使用旧版本(并且无法使用 boost),那么什么以及为什么是最好的替代方案呢?
我看到几个选项:
-
STL智能指针(仅限 C++11)
std::unique_ptr<double> possiblyFailingCalculation();
- (+) 与可选的用法几乎相同
- (−) 指向非多态类型或内置类型的智能指针会造成混淆
-
将其与 bool 配对
std::pair<double,bool> possiblyFailingCalculation();
-
老式
bool possiblyFailingCalculation(double& output);
- (−) 与新的 C++11 不兼容
auto value = calculation()
style
DIY 模板:具有相同功能的基本模板很容易编写代码,但是实现健壮的模板是否存在任何陷阱std::optional<T>
看起来很像的模板?
-
抛出异常
std::optional
,喜欢它的boost::optional
Parent,是一个非常基本的类模板。它是bool
、一些存储和一堆方便的成员函数,其中大部分是一行代码和一个断言。
DIY 选项绝对是首选。 (1) 涉及分配,(2)、(3) 涉及必须构造一个T
即使你想要一个空值 - 这对于double
但对于更昂贵的类型来说确实很重要。对于 (5),例外不能替代optional
.
您始终可以将您的实现与 Boost 的实现进行比较。毕竟,这是一个小型的只有标头的库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)