C ++ 17元组解包

时间:2019-03-13 20:07:05

标签: c++ tuples c++17

我正在尝试打开一个元组并将结果分配给成员。是否可以在惯用的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();
}

1 个答案:

答案 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();
    }
};

这些都不是特别棒。