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提供的框架可以接受任何类型未被初始化的对象。
联系客服