C++17元组解包

4
我正在尝试解包元组并将结果分配给成员。在C++17中是否可以以惯用方式实现这一点?
我意识到存在std::tie,但我正在尝试利用C++17功能而不是默认使用旧特性或旧方式(std::get(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();
}

4
你能把这段话转化成一个“最小完整可复现示例”吗?代码看起来似乎可以工作,但是还缺少一些东西。 - NathanOliver
为什么要忽略之前的版本?我的意思是,你会停止使用虚函数,因为它们在'98年就出现了吗? - Gem Taylor
3
@GemTaylor,对这个问题的一个不那么敌对的解释可能是:“我们在C++17中有结构化绑定。是否存在一种新的、更好的方法来解决这个问题,或者我必须使用旧的方法?” - Barry
@Barry,这正是我所问的。 - Mercutio Calviary
1个回答

6
并不是。结构化绑定只能声明新的名称,不能将值分配给现有的名称。
最好的方法是这样做:
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();
    }
};

这些都不是特别好的选择。


那真是不幸,但C++2X仍有希望。 - Mercutio Calviary
可能还要将元组接受构造函数设为私有。 - Red.Wave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接