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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通