【问题标题】:What is this C++ syntax for looping through variadic templates?循环可变参数模板的 C++ 语法是什么?
【发布时间】:2022-06-13 01:26:08
【问题描述】:

我在阅读std::integer_sequence 时遇到了这种语法。

这个双括号有什么作用?它看起来像某种形式的循环。它仅适用于非类型模板参数吗?它必须与参数的顺序相同吗?我们可以向后迭代吗?跳过一个数字?

// pretty-print a tuple
template<class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple_impl(std::basic_ostream<Ch,Tr>& os,
                      const Tuple& t,
                      std::index_sequence<Is...>)
{
    ((os << (Is == 0? "" : ", ") << std::get<Is>(t)), ...);
}

【问题讨论】:

  • 折叠表达式
  • 另请注意,这里的std::index_sequence 不是将元组输出到basic_ostream 所必需的。 std::apply 的页面有一种方法可以做到这一点,您仍然有一个逗号,但不需要索引序列。

标签: c++


【解决方案1】:

有关于此的文档:fold expression

简而言之,在这种情况下,... 表示对包中的所有参数重复指定的运算符。因此,在这种情况下,它将被解包为一系列表达式,用逗号分隔Is 的每个后续元素,如下所示:

(os << "" << std::get<0>(t)), (os << ", " << std::get<1>(t)), (os << ", " << std::get<2>(t)), (os << ", " << std::get<3>(t))

【讨论】:

  • 谢谢,与必须使用递归解压缩模板变量相比,这看起来会非常方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2014-05-28
  • 2011-12-19
  • 2012-08-07
相关资源
最近更新 更多