打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
boost::optional<>

Optional是一个处理对象初始化不确定问题的框架。比如,不知道一个函数返回的对象是否被成功的创建,Boost就提供了检验是否初始化的框架。再比如,一个类的成员被一个构造函数初始化,在使用这个成员之前,对初始化的效验必须被执行。Optional包含在这个头文件:

<boost/optional.hpp>

初始化一个optional对象方式如下:

Boost::optional<T> opt(t);

这里的t是模板类T的一个实例,变量opt现在又一个值1,如果opt没有被初始化,则值为0。因此,我们可以检验opt是否在使用之前有个值。或者,变量可以用NULL关键字核对。

被传递给optional的类可以通过多种方式提取。比如,这些函数返回对象或指针:

l  get():返回对象

l  operator*():返回对象

l  get_ptr():返回指向对象的指针

下面是一个初始化double变量的代码:

voidtestingOptional1()

{

    boost::optional<double> myOpt1;

    doubleb = 1.1;

    boost::optional<double> myOpt2(b);

 

    std::cout << myOpt1 << std::endl;

    std::cout << myOpt2 << std::endl;

 

    if (myOpt1 == NULL)

    {

       std::cout << "Empty Object" << std::endl;

    }

    else

    {

       std::cout << *myOpt1 << std::endl;

    }

 

    if (myOpt2 == NULL)

    {

       std::cout << "Empty Object" << std::endl;

    }

    else

    {

       std::cout << *myOpt2 << std::endl;

    }

}

 

输出是:

 

0

1

Empty Object

1.1

 

这个类是一个优良的特性是实现了==操作符,可以在optional对象和基础对象间作比较。比如下面的代码:

doublea=10.0; boost::optional<double> optA(a);

boolisA=(optA==a);

isA被赋值true。作为讨论的总结,我们个出一个optional成员变量初始化的例子。我们有一个名叫SimpleSettlementClass类,包含两个构造函数。第一个构造函数获取结算日期,第二个则带有结算日期和需要增加到结算日期上面的天数。所以我们设置这个变量到optional。这里使用的boost日期类库不在这里介绍。语法是简单易懂的,代码如下:

classSimpleSettlementClass

{

private:

    boost::gregorian::dated_;

    boost::optional<int> settlementDays_;

public:

    SimpleSettlementClass(constboost::gregorian::date& d):d_(d)

    {};

    SimpleSettlementClass(constboost::gregorian::date& d, constint& settlementDays):d_(d),

       settlementDays_(settlementDays)

    {};

    boost::gregorian::datesettlement() const

    {

       if (settlementDays_)

       {

           returnd_ + boost::gregorian::days(*settlementDays_);

       }

       else

       {

           returnd_;

       }

    }

    intsettlementDays() const

    {

       if (settlementDays_)

       {

           return *settlementDays_;

       }

       else

       {

           return 0;

       }

    }

};

 

该类的功能用下面代码测试:

 

voidtestingOptional2()

{

    boost::gregorian::dated1(2009,9,20);

 

    SimpleSettlementClasssettlement1(d1);

    SimpleSettlementClasssettlement2(d1, 3);

 

    std :: cout << " Settlement 1: " << settlement1 . settlement ()<< std :: endl ;

    std :: cout << " Settlement 2: " << settlement2 . settlement ()<< std :: endl ;

    std :: cout << " Settlement 1 Days : " << settlement1 . settlementDays ()<< std :: endl ;

    std :: cout << " Settlement 2 Days : " << settlement2 . settlementDays ()<< std :: endl ;

}

 

输出结果是:

Settlement 1: 2009-Sep-20

Settlement 2: 2009-Sep-23

Settlement 1 Days : 0

Settlement 2 Days : 3

 

当然,在构造函数中通过适当的计算,还有其他简单的方式达到相同的效果。然而,我们可以思考一下其他情况下适当使用optional框架,我们注意到optional类为Null提供的框架可以接受任何类型未被初始化的对象。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[Boost]boost的时间和日期处理-(2)时间的操作
在Ubuntu下安装boost库
Boost编程指南之BoostThread
【转】C++ 智能指针详解
Boost socket 同步编程示例(服务端,客户端)
boost安装总结
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服