Dan*_*nra 2 c++ tuples variadic-templates c++14
我正在尝试设置引用元组中引用的对象的值,但无法正确获取解包语法.
namespace detail {
template<class... Types, std::size_t... Is>
void assign_values_helper(std::tuple<Types&...>& dest, std::index_sequence<Is...>, Types... values)
{
std::get<Is>(dest)... = values...;
}
} // end namespace detail
template<class... Types>
void assign_values(std::tuple<Types&...>& dest, Types... values)
{
assign_values_helper(dest, std::index_sequence_for<Types...>{}, values...);
}
Run Code Online (Sandbox Code Playgroud)
assign_values_helper
关于Is
未扩展我的错误.
示例使用assign_values
将是
int a {};
double b {};
std::tuple<int&, double&> tup = {a, b};
assign_values(tup, 1, 2.0);
Run Code Online (Sandbox Code Playgroud)
两个问题:
您试图在c++14 中根本不允许的上下文中扩展包。
对于整个赋值表达式,应该只有一个包扩展。
我们可以通过引入一个虚拟数组来修复它,它的初始化器将为包扩展提供上下文:
int dummy[]{ ((void(std::get<Is>(dest) = values)), 0)... };
(void)dummy;
Run Code Online (Sandbox Code Playgroud)
在C ++ 17的解决方案是一个倍的表达,自然:
(void(std::get<Is>(dest) = values), ...);
Run Code Online (Sandbox Code Playgroud)
tup = std::make_tuple(1, 2.0);
Run Code Online (Sandbox Code Playgroud)
有特殊的重载operator=
用于分配不同类型的std::tuple
:
template <class... UTypes>
tuple& operator=(const tuple<UTypes...>& u);
template <class... UTypes>
tuple& operator=(tuple<UTypes...>&& u);
Run Code Online (Sandbox Code Playgroud)
第二个(这是在这里调用的那个)完全符合你的要求:
对所有人来说
i
,分配std::forward<Ui>(std::get<i>(u))
给get<i>(*this)
.