C++ 具有多个参数包的可变模板构造函数

C++ 具有多个参数包的可变模板构造函数,c++,c++14,variadic-templates,C++,C++14,Variadic Templates,我读过,还有很多其他的。。。但这些帖子都不能回答或适用于我的具体问题 我有一个带有可变模板构造函数的structX: struct X { template<typename... T> X(T... t) { /*...*/ } }; Y y({args_x1...}, {args_x2...}); 我如何使用包装器、元组或任何合适的元编程机器做到这一点?C++14解决方案是可以接受的。Bog标准索引\u序列技巧 struct Y { private:

我读过,还有很多其他的。。。但这些帖子都不能回答或适用于我的具体问题

我有一个带有可变模板构造函数的struct
X

struct X
{
    template<typename... T>
    X(T... t)   { /*...*/ }
};
Y y({args_x1...}, {args_x2...});

我如何使用包装器、元组或任何合适的元编程机器做到这一点?C++14解决方案是可以接受的。

Bog标准
索引\u序列
技巧

struct Y
{
private:
    template<typename... U, typename... V,
             std::size_t... UIs, std::size_t... VIs>
    Y(std::tuple<U...>&& u, std::tuple<V...>&& v,
      std::index_sequence<UIs...>, std::index_sequence<VIs...>)
        : x1(std::get<UIs>(std::move(u))...), 
          x1(std::get<VIs>(std::move(v))...)  
        {}
public:
    template<typename... U, typename... V>
    Y(std::tuple<U...> u, std::tuple<V...> v)
        : Y(std::move(u), std::move(v),
            std::index_sequence_for<U...>{},
            std::index_sequence_for<V...>{})
        {}

    X x1, x2;
};

使用元组是一个很大的开销,因为它已经要求从X开始是可移动/可复制的,您可以直接使用该约束,并获得有史以来可读性最高的代码:

struct Y
{
    Y(X && _x1, X && _x2)                        
        : x1(std::move(_x1)), x2(std::move(_x2)) 
        {}

    X x1, x2;
};
在代码中只需编写:

Y y(X(args_x1...), X(args_x2...));
或者,如果X具有隐式构造函数:

struct X
{
    template<typename... T>
    X(T... t)   { /*...*/ }
};
Y y({args_x1...}, {args_x2...});


更有趣的问题是,如果X不可移动/可复制,但这超出了范围;)

@πάνταῥεῖ: 我要的是C++14;您链接的问题可能是解决我问题的合适方法,但它已经存在2年了!使用C++14可能有更好的方法。我不太确定C++14对VTP的解包有多大的改变,但好吧…@πάνταῥεῖ: 你不确定?我很确定C++14为解包元组添加了一些新的有趣功能…哦,你现在给问题添加了标签,所以我无法单独重新打开它,对不起。但这给了一个机会,重新开放,至少是由其他4人确认。给了你一张选票,以吸引更多的评论者。@πάνταῥεῖ 我投票决定重新开放,因为我觉得问题和答案充其量是令人困惑的。非常感谢,你的把戏很管用。。。除非我想传递对内部对象的引用
x1
&
x2
;(我试着使用
std::forward_as_tuple()
),但这不起作用。)有没有办法修改您的代码,使其可以处理引用的元组?(我更新了我的问题,以显示我需要的完美转发。)不需要任何修改。没错!我在参数表上犯了错误。你的技巧也非常适用于推荐人。谢谢。