我正在尝试打开一个元组并将结果分配给成员。是否可以在惯用的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();
}
答案 0 :(得分:5)
不是。结构化绑定只能声明新名称,而不能分配到现有名称。
最好是这样做:
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();
}
};
这些都不是特别棒。