在可选结构成员中分配成员
Assigning member in optional structure memeber
分配结构的可选成员的最佳样式是什么?
例如我有一个结构:
struct B{
public:
int x;
}
struct A{
public:
boost::optional<B> b;
};
void foo(){
A a;
a.b.x = 10; //Runtime exception because a.b is not initialized.
}
一种选择是定义临时 B 结构并将其分配给 A:
void foo(){
A a;
B tmp;
a.b = tmp;
a.b.x = 10; //OK.
}
或:
void foo(){
A a;
a.b = B();
a.b.x = 10; //OK.
}
有没有更清晰的方法来做到这一点?
您别无选择,只能在使用前对其进行初始化。如果不这样做,您将遇到断言失败,这将导致终止。
但是如果你问的是初始化它的方法,有很多方法:
a.b = B{10}
因为它是 POD 类型。
a.b = B()
就像您已经做的那样(始终有效,不仅适用于 POD 类型)。
- 创建一个构造函数并使其像
a.b = B(10)
。但是,您仍然必须创建一个对象并分配给它。因此,您可以隐式或显式创建对象,但您必须这样做。
- 在 boost 1.56 中,正如@n.m 所说,这里有一个
emplace()
方法可以为您做同样的事情:a.b.emplace()
.
分配结构的可选成员的最佳样式是什么? 例如我有一个结构:
struct B{
public:
int x;
}
struct A{
public:
boost::optional<B> b;
};
void foo(){
A a;
a.b.x = 10; //Runtime exception because a.b is not initialized.
}
一种选择是定义临时 B 结构并将其分配给 A:
void foo(){
A a;
B tmp;
a.b = tmp;
a.b.x = 10; //OK.
}
或:
void foo(){
A a;
a.b = B();
a.b.x = 10; //OK.
}
有没有更清晰的方法来做到这一点?
您别无选择,只能在使用前对其进行初始化。如果不这样做,您将遇到断言失败,这将导致终止。
但是如果你问的是初始化它的方法,有很多方法:
a.b = B{10}
因为它是 POD 类型。a.b = B()
就像您已经做的那样(始终有效,不仅适用于 POD 类型)。- 创建一个构造函数并使其像
a.b = B(10)
。但是,您仍然必须创建一个对象并分配给它。因此,您可以隐式或显式创建对象,但您必须这样做。 - 在 boost 1.56 中,正如@n.m 所说,这里有一个
emplace()
方法可以为您做同样的事情:a.b.emplace()
.