将值分配给引用元组

时间:2018-02-05 10:31:00

标签: c++ tuples c++14 variadic-templates

我试图设置引用元组中引用的对象的值,但是无法正确获取解包语法。

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

我在assign_values_helper中收到关于Is未展开的错误。

使用assign_values的示例

int a {};
double b {};
std::tuple<int&, double&> tup = {a, b};
assign_values(tup, 1, 2.0);

3 个答案:

答案 0 :(得分:5)

使用std::make_tuple

tup = std::make_tuple(1, 2.0);

有一些特殊的重载operator=用于分配不同类型的std::tuple

template <class... UTypes>
tuple& operator=(const tuple<UTypes...>& u);

template <class... UTypes>
tuple& operator=(tuple<UTypes...>&& u);

第二个(在这里被调用的那个)完全符合你的要求:

  

对于所有i,将std::forward<Ui>(std::get<i>(u))分配给get<i>(*this)

答案 1 :(得分:4)

两个问题:

  1. 您正试图在https://activemq.apache.org/apollo/documentation/stomp-manual.html#Temporary_Destinations中不允许的上下文中扩展包。

  2. 整个作业表达式应该只有一个包扩展。

  3. 我们可以通过引入虚拟数组来修复它,其初始化程序将为包扩展提供上下文:

    $('#Category').on('change', function (e) {
       $("#Container").append(`@foreach (var item in Model.YetkinlikKategorileri.Where(x => x.Id == $('#Category').val()))
       {
           <p>hello</p>
       }`);
    });
    

    解决方案是折叠表达式,当然:

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

答案 2 :(得分:0)

感谢您提供一个好榜样!

std :: tie非常适用于此:

template<class... Types>
void assign_values(std::tuple<Types&...>& dest, Types... values) {
    dest = std::tie(values...);
}

int main() {
  int a {};
  double b {};
  std::tuple<int&, double&> tup = {a, b};
  assign_values(tup, 1, 2.0);
  return a + b;
}

请参阅https://godbolt.org/g/oU2Pi8以获取证明。

附加说明:最好添加一些const安全性,这也会阻止你按值传递字符串:

template<class... Types>
void assign_values(std::tuple<Types&...>& dest, const Types&... values) {
    dest = std::tie(values...);
}