将值分配给引用元组

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)

Sto*_*ica 5

两个问题:

  1. 您试图在根本不允许的上下文中扩展包。

  2. 对于整个赋值表达式,应该只有一个包扩展。

我们可以通过引入一个虚拟数组来修复它,它的初始化器将为包扩展提供上下文:

int dummy[]{ ((void(std::get<Is>(dest) = values)), 0)... };
(void)dummy;
Run Code Online (Sandbox Code Playgroud)

的解决方案是一个倍的表达,自然:

(void(std::get<Is>(dest) = values), ...);
Run Code Online (Sandbox Code Playgroud)


Hol*_*olt 5

用途std::make_tuple:

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).