optional的用法

optional使用

代码一:

#include <iostream>
#include <boost/optional.hpp>

using namespace boost;

int main() {

   optional<int> op;
   op = 1000;
   std::cout << "op=" << op << std::endl; //输出op=1
   
   if (op.is_initialized()) {
    std::cout << "op=" << op.get() << std::endl; //输出op=1000
   }
   return 0;
}

代码二:

#include <iostream>
#include <boost/optional.hpp>

using namespace boost;

int main() {

   optional<int> op;
   std::cout << "op=" << op << std::endl; //输出op=0
   
   if (op.is_initialized()) {
    std::cout << "op=" << op.get() << std::endl; //进不来
   }
   return 0;
}

从上面代码可知:直接使用op是可以拿到结果的,这是因为optional内部实现一个本类型到bool的隐式转换 ;所以得到的结果只有true 和 false。

// implicit conversion to "bool"
// No-throw
operator unspecified_bool_type() const { return this->safe_bool() ; }

 // This is provided for those compilers which don't like the conversion to bool
 // on some contexts.
 bool operator!() const { return !this->is_initialized() ; }

使用get()函数是获取optional变量的值。如果在get()之前没有初始化且没有判断is_initialized(),会抛出异常。

reference_const_type get() const { BOOST_ASSERT(this->is_initialized()) ; return this->get_impl(); }
reference_type       get()       { BOOST_ASSERT(this->is_initialized()) ; return this->get_impl(); }

所以正确的使用方式应该是先去判断optional初始化,然后使用。

   if (op.is_initialized()) {
    std::cout << "op=" << op.get() << std::endl;
   }

参考资料:

boost optional 源码:
https://www.boost.org/doc/libs/1_34_0/boost/optional/optional.hpp
C++ typedef的详细用法:
https://www.cnblogs.com/phpandmysql/p/10816949.html
unspecified_bool_type boost实现本类型到bool隐式转换:
https://blog.csdn.net/iteye_14736/article/details/81339891
operator bool()的作用及用法:
https://blog.csdn.net/znzxc/article/details/80385995

posted @   小海哥哥de  阅读(344)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示