• 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

  • 相关阅读:
    成长篇之代码灵异事件
    idea快捷键
    java环境配置常用链接
    MySQL分区
    English 动词篇
    仿stl+函数模板
    java 数组复制
    拓扑排序(Topological Sorting)
    2017蓝桥杯第十题(k倍区间)
    翻译NYOJ
  • 原文地址:https://www.cnblogs.com/xiaohaigegede/p/15510010.html
Copyright © 2020-2023  润新知