2015-02-08 106 views
4

有什么办法可以在不提供T名的情况下默认初始化boost :: optional变量吗?默认初始化boost ::可选

struct MyStruct 
{ 
    int a; 
}; 

int main(){ 
    boost::optional<MyStruct> opt; 
    opt = MyStruct(); // <-- 
} 

我的目标是省略提供结构的名字时,我只是想为默认初始化选择

回答

2

您可以使用就地工厂,如果你想默认初始化一个可选值

#include <boost/optional.hpp> 
#include <boost/utility/in_place_factory.hpp> 

struct Foo 
{ 
    Foo() {} 
    int bar = 5; 
}; 

int 
main() 
{ 
    boost::optional<Foo> foo; 
    assert(!foo); 
    foo = boost::in_place(); 
    assert(foo); 
} 

live demo here

+1

'boost :: optional'现在有'emplace()'成员函数(从1.56.0开始)。我们应该使用它。 – 2015-02-09 03:58:18

6

如果你的编译器支持可变参数模板,并且使用升压版本1.56或更高版本,使用emplace()不带任何参数:

opt.emplace(); 

如果任一条件不满足(或编译器没有可变参数模板或旧的升压)使用in_place出厂不带任何参数:

opt = boost::in_place(); 

在升压1.59,您将能够调用0参数的emplace()即使在C++编译器03。