首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最好的替代std::可选返回一个可选的值从一个方法?(使用C++98/C++11/C++14)

最好的替代std::可选返回一个可选的值从一个方法?(使用C++98/C++11/C++14)
EN

Stack Overflow用户
提问于 2016-03-16 10:43:26
回答 3查看 14.6K关注 0票数 34

显然,如果使用std::optional或boost,则最好选择从函数返回可选值(另见GOTW #90)。

代码语言:javascript
复制
std::optional<double> possiblyFailingCalculation()

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

我看到了几个选择:

  1. STL智能指针(仅限C++11) std::unique_ptr possiblyFailingCalculation();
代码语言:javascript
复制
- (+) virtually the same usage as optional
- (−) confusing to have smart pointers to non-polymorphic types or built-in types

  1. 将其与bool配对 std::pair possiblyFailingCalculation();
  2. 旧式 bool (双输出);
代码语言:javascript
复制
- (−) incompatible with new C++11   `auto value = calculation()`  style

  1. 一个DIY模板:一个具有相同功能的基本模板很容易编写代码,但是实现一个健壮的类似于std::optional<T>的模板有什么缺陷吗?
  2. 抛出异常
代码语言:javascript
复制
- (−) Sometimes "impossible to calculate" is a valid return value.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-16 10:58:09

std::optional和它的boost::optional父类一样,是一个非常基本的类模板。它是一个bool、一些存储和一组方便的成员函数,其中大部分是一行代码和一个断言。

DIY的选择绝对是首选。(1)涉及分配,(2),(3)涉及到即使您想要一个空值,也必须构造一个T --对于double来说,这一点都不重要,但是对于更昂贵的类型来说,这一点很重要。除了(5),异常并不是optional的替代品。

你总是可以比较你的实现和Boost的,毕竟它只是一个小的标头库。

票数 24
EN

Stack Overflow用户

发布于 2020-11-25 18:14:27

而不是std::optional,使用tl::optional从以下链接:https://github.com/TartanLlama/optional

它具有与其std对应的相同的公共接口,但它也在C++98中编译。

我在生产代码(C++11)中使用了它,工作非常棒!

票数 3
EN

Stack Overflow用户

发布于 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)之类的东西,以避免神奇的值,并表明值可能不存在,并且用户应该检查它的潜在缺位。

有关此方法的其他动机和概述:有效可选值

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36033337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档