显然,如果使用std::optional或boost,则最好选择从函数返回可选值(另见GOTW #90)。
std::optional<double> possiblyFailingCalculation()但是,如果一个人坚持使用旧版本(并且不能使用boost),那么什么和为什么是最好的选择呢?
我看到了几个选择:
- (+) virtually the same usage as optional
- (−) confusing to have smart pointers to non-polymorphic types or built-in types
- (−) incompatible with new C++11 `auto value = calculation()` style
std::optional<T>的模板有什么缺陷吗?- (−) Sometimes "impossible to calculate" is a valid return value.
发布于 2016-03-16 10:58:09
std::optional和它的boost::optional父类一样,是一个非常基本的类模板。它是一个bool、一些存储和一组方便的成员函数,其中大部分是一行代码和一个断言。
DIY的选择绝对是首选。(1)涉及分配,(2),(3)涉及到即使您想要一个空值,也必须构造一个T --对于double来说,这一点都不重要,但是对于更昂贵的类型来说,这一点很重要。除了(5),异常并不是optional的替代品。
你总是可以比较你的实现和Boost的,毕竟它只是一个小的标头库。
发布于 2020-11-25 18:14:27
而不是std::optional,使用tl::optional从以下链接:https://github.com/TartanLlama/optional
它具有与其std对应的相同的公共接口,但它也在C++98中编译。
我在生产代码(C++11)中使用了它,工作非常棒!
发布于 2020-04-28 21:00:51
我也会考虑一个前哨值。
在double的情况下,NaN值(std::numeric_limits::quiet_NaN())是可能的候选值(只有当std::numeric_limits<double>::has_quiet_NaN == true有意义时才是有意义的)。
对于这种方法有很多不同的看法(例如,看看NaN或false作为双精度返回值和双倍好的哨位值,如果喜欢用数学的话)。
在特定领域,还可以有其他有意义的哨兵值。
在任何情况下(不仅仅是对于double),我都会采用/实现类似于markable (https://github.com/akrzemi1/markable)之类的东西,以避免神奇的值,并表明值可能不存在,并且用户应该检查它的潜在缺位。
有关此方法的其他动机和概述:有效可选值。
https://stackoverflow.com/questions/36033337
复制相似问题