我试图打开一个元组,并使用结果分配给成员。是否可以在惯用的C++ 17中做到这一点?
我意识到std::tie
存在,但我正在尝试利用C++ 17功能,而不是默认使用较旧的功能或较旧的方法(std::get<N>(tuple)
)
tuple<A, vector<A>> IO(){
//IO happens here
return {var, vec};
}
class foo{
public:
foo();
private:
A var;
vector<A> vec;
};
foo::foo(){
//this line here: I want to assign var and vec from IO()
[var, vec] = IO();
}
最佳答案
并不是的。结构化绑定(bind)只能声明新名称,而不能分配给现有名称。
最好是这样做:
foo() : foo(IO()) { } // delegate to a constructor, calling IO
foo(std::tuple<A, vector<A>>&& tup) // manually unpack within this constructor
: var(std::get<0>(std::move(tup)))
, vec(std::get<1>(std::move(tup)))
{ }
如果
A
恰好是默认可构造的并且可以移动可分配的,那么是的,这也是可行的:foo() {
std::tie(var, vec) = IO();
}
如果
A
不能默认构造,则可以使用optional
添加该额外状态:struct foo {
std::optional<A> var;
std::vector<A> vec;
foo() {
std::tie(var, vec) = IO();
}
};
这些都不是特别出色。