我需要将元组的值转发给成员初始值设定项:
struct Struct {
Member1 member1;
Member2 member2;
template<typename Tuple1, typename Tuple2>
Struct( Tuple1&& tuple1, Tuple2&& tuple2 )
: member1(tuple1...), member2(tuple2...)
{}
};上面的代码显然是无效的。我该如何表达呢?
Member1和Member2没有默认的/复制/移动构造函数。
按照How do I expand a tuple into variadic template function's arguments?中的建议,我知道std::apply。我也知道std::make_from_tuple。但是我不知道如何在成员初始化器中使用它们。
任何C++标准都可以(最好是C++17,但C++20也可以)。
为了清楚起见,我的真正目标是创建一个Struct,向它传递两组可变参数以使其完美-将它们转发到初始化member1和member2。我认为将这两个集合“分组”成元组可能是个好主意,因为这就是std::map::emplace所做的。其他方法也可以(例如,在两组可变参数之间传递一个特殊的对象)。
发布于 2020-12-25 07:29:56
std::make_from_tuple确实是正确的选择:
#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'});
}https://stackoverflow.com/questions/65443904
复制相似问题