首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将元组的值转发到成员初始值设定项?

如何将元组的值转发到成员初始值设定项?
EN

Stack Overflow用户
提问于 2020-12-25 07:03:28
回答 2查看 64关注 0票数 3

我需要将元组的值转发给成员初始值设定项:

代码语言:javascript
复制
struct Struct {
  Member1 member1;
  Member2 member2;

  template<typename Tuple1, typename Tuple2>
    Struct( Tuple1&& tuple1, Tuple2&& tuple2 )
      : member1(tuple1...), member2(tuple2...)
    {}
};

上面的代码显然是无效的。我该如何表达呢?

Member1Member2没有默认的/复制/移动构造函数。

按照How do I expand a tuple into variadic template function's arguments?中的建议,我知道std::apply。我也知道std::make_from_tuple。但是我不知道如何在成员初始化器中使用它们。

任何C++标准都可以(最好是C++17,但C++20也可以)。

为了清楚起见,我的真正目标是创建一个Struct,向它传递两组可变参数以使其完美-将它们转发到初始化member1member2。我认为将这两个集合“分组”成元组可能是个好主意,因为这就是std::map::emplace所做的。其他方法也可以(例如,在两组可变参数之间传递一个特殊的对象)。

EN

Stack Overflow用户

回答已采纳

发布于 2020-12-25 07:29:56

std::make_from_tuple确实是正确的选择:

代码语言:javascript
复制
#include <tuple>
struct Member1 {
    Member1(int x,float y, char z){}

    Member1(const Member1& other)=delete;
    Member1(Member1&& other)=delete;
};

struct Member2 {
    Member2(int x,float y, char z){}

    Member2(const Member2& other)=delete;
    Member2(Member2&& other)=delete;
};

struct Struct {
  Member1 member1;
  Member2 member2;

  template<typename Tuple1, typename Tuple2>
    Struct(Tuple1&& tuple1, Tuple2&& tuple2)
      : member1(std::make_from_tuple<Member1>(std::forward<Tuple1>(tuple1))),
       member2(std::make_from_tuple<Member2>(std::forward<Tuple2>(tuple2)))
    {}
};

int main(){
    Struct c(std::tuple{1,1.1,'c'},std::tuple{2,2.2,'x'});
}

Godbolt demo

票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65443904

复制
相关文章

相似问题

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