Boost实用工具之如何表示无效值optional

12 篇文章 5 订阅
本文介绍了在C++中如何表示无效值,包括抛出异常和使用‘哨兵’值。重点讨论了boost::optional作为无效值表示的工具,详细讲解了如何创建、初始化和使用optional,并通过示例展示了其在处理除法操作中的应用。此外,还解释了optional的疑问,如如何正确判断其内部值为false。最后,提到了optional在源码中的typedef技巧,增强了代码可读性。
摘要由CSDN通过智能技术生成

1 在C++中如何表示无效值?

无效值?
答:可以理解成不是我们希望的值,或者说返回值是位于解空间外的值。比如,我们希望除法分母不为0,开平方不能小于0等等

如何表示无效值?
答:下面是我们常见的手法
1. 发现错误,就抛出异常
2. 为无效值增加“哨兵”,比如NULL,EOF,string::pos,-1等等

上述做法的问题?

  1. 在要求苛刻的场景下,抛出异常是不能忍受的
  2. 遇到无法表示的”哨兵“

2 boost使用optional表达无效值,已被引入C++17

把optional理解成指针!!!.
下面是思维导图
在这里插入图片描述
下面分享重要的内容

2.1 创建optional

无效值常量

boost::none

创建未初始化值的两种方法

    // 创建空对象的两种方式
    boost::optional<int> op0;
    boost::optional<int> op1(boost::none);
    assert(op0 == op1 && !op0);

2.2 按条件初始化

条件不满足,初始化为无效值,否则是初始化值
下面是一个除法,排除分母为0的案例

boost::optional<double> reciprocal(int x) {
    return boost::optional<double>(x != 0, 1.0 / x); // 满足不为0,则求倒数
}

// main
boost::optional<double> d1 = reciprocal(0);
 if (!d1)
 {
     std::cout << "no result" << std::endl;
 }

2.3 请把optional当成指针

    boost::optional<std::string> ops("test");
    // 下面的输出都是test
    std::cout << *ops << std::endl;
    std::cout << ops.get() << std::endl;
    
    // 就地创建一个字符串,这里只用前三个构造
    ops.emplace("monado", 3);
    assert(*ops == "mon");

2.4 关于optional的疑惑

下面的代码,能不能实现目标–判断b是否是false

optional<bool> b(false);
if(!b)
	cout << "false" << endl;

答:不能,!b表示b是否已经初始化,而不是判断内容为false
正确的做法,首先b已经初始化而且值为false

if(b && !*b)
	cout << "false" << endl;

3 其他

源码中,有大量typedef,这样代码可读性更强,

// 类型名
#define BOOST_DEDUCED_TYPENAME typename

其中,下面包含了绝大部分,可以借鉴

	value_type -						----> T
	reference_type 						----> T&
	reference_const_type/argument_type  ----> T cosnt &
	rval_reference_type  				----> T&&
	pointer_const_type					----> T const*
    typedef optional<T> this_type ;

    typedef BOOST_DEDUCED_TYPENAME base::value_type           value_type;
    typedef BOOST_DEDUCED_TYPENAME base::reference_type       reference_type;
    typedef BOOST_DEDUCED_TYPENAME base::reference_const_type reference_const_type;
#ifndef  BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
    typedef BOOST_DEDUCED_TYPENAME base::rval_reference_type  rval_reference_type;
    typedef BOOST_DEDUCED_TYPENAME base::reference_type_of_temporary_wrapper reference_type_of_temporary_wrapper;
#endif
    typedef BOOST_DEDUCED_TYPENAME base::pointer_type         pointer_type;
    typedef BOOST_DEDUCED_TYPENAME base::pointer_const_type   pointer_const_type;
    typedef BOOST_DEDUCED_TYPENAME base::argument_type        argument_type;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值