【问题标题】:Pass a fold expression to a variadic template [closed]将折叠表达式传递给可变参数模板[关闭]
【发布时间】:2020-06-09 21:53:44
【问题描述】:

考虑以下使用折叠表达式打印参数的函数。

template <typename... T>
void print(T &&... t)
{
    (std::cout << ... << t) << '\n';
}

考虑调用它的第二个函数:

template <typename T, T... vals>
void call_print(std::integer_sequence<T, vals...> &&)
{
    print(vals...); //ok: prints 01234
}
call_print(std::make_index_sequence<5>{});

在我的用例中,我需要以这种方式调用print(使用折叠表达式)

template <typename T, T... vals>
void call_print2(std::integer_sequence<T, vals...> &&)
{
    print((vals, ...)); //not OK: only prints 4
}
call_print2(std::make_index_sequence<5>{});

在这种情况下,调用看起来像这样

print(0,(1,(2,(3,4))));

但该函数似乎只捕获最后一个参数,就好像我这样称呼它:

print(4);

任何帮助将不胜感激

编辑:我真正想要完成的事情

template<typename T, T ... ints>
auto make_seq(std::integer_sequence<T, ints...>&&)
{
   auto lambda = []<T val>()->T{/*implementation doesn't matter*/};
   return std::integer_sequence<T, (lambda.template operator()<ints>(), ...)>{}; //<- right here
}

【问题讨论】:

  • 你的意思是要反向打印?
  • 不,我想传递一个折叠表达式
  • 您正在折叠逗号运算符,因此将一个参数传递给print。这没有任何意义。你能举个例子说明你真正想要实现的目标吗?
  • 你希望调用输出什么?
  • 我的意思是std::integer_sequence&lt;T, lambda.template operator()&lt;ints&gt;() ...&gt;{};(因错字而编辑)

标签: c++ c++17 fold-expression


【解决方案1】:

print((vals, ...)) 扩展为 print((0, 1, 2, 3, 4))(0, 1, 2, 3, 4) 是使用逗号运算符的表达式。逗号运算符计算其两个操作数并丢弃表达式左侧的结果。这意味着表达式 (0, 1, 2, 3, 4) 的计算结果为值 4。因此print((vals, ...))print((0, 1, 2, 3, 4)) 相同与print(4) 相同。

通常,折叠表达式是表达式,因此计算结果为单个值。您需要改用普通的参数包扩展。例如:

template<typename T, T... ints>
auto make_seq(std::integer_sequence<T, ints...>&&)
{
   auto lambda = []<T val>()->T{/*implementation doesn't matter*/};
   return std::integer_sequence<T, lambda.template operator()<ints>()...>{};
}

Live Demo

【讨论】:

  • 用折叠表达式产生print(0,1,2,3,4) 的任何方法?
  • @jbztt 否。折叠表达式是表达式,展开生成表达式。你只需要一个正常的包扩展。更新了一个例子。
猜你喜欢
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多