首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++17元组解包

C++17元组解包
EN

Stack Overflow用户
提问于 2019-03-13 20:07:04
回答 1查看 1.3K关注 0票数 3

我试图打开一个元组,并使用结果分配给成员。在惯用的C++17中可以做到这一点吗?

我意识到std::tie是存在的,但我试图利用C++17特性,而不是默认使用旧特性或旧方式(std::get<N>(tuple))。

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-13 20:11:56

不怎么有意思。结构化绑定只能声明新名称,不能分配给现有名称。

最好就是这么做:

代码语言:javascript
复制
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碰巧是默认的可构造且可移动的,那么是的,这也是可行的:

代码语言:javascript
复制
foo() {
    std::tie(var, vec) = IO();
}

如果A碰巧不是默认可构造的,那么您可以使用optional添加额外的状态:

代码语言:javascript
复制
struct foo {
    std::optional<A> var;
    std::vector<A> vec;

    foo() {
        std::tie(var, vec) = IO();
    }
};

这些都不是特别伟大的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55150392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档