C++ 具有多个参数包的可变模板构造函数
我读过,还有很多其他的。。。但这些帖子都不能回答或适用于我的具体问题 我有一个带有可变模板构造函数的structC++ 具有多个参数包的可变模板构造函数,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:
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()
),但这不起作用。)有没有办法修改您的代码,使其可以处理引用的元组?(我更新了我的问题,以显示我需要的完美转发。)不需要任何修改。没错!我在参数表上犯了错误。你的技巧也非常适用于推荐人。谢谢。