将折叠表达式传递给可变参数模板
Pass a fold expression to a variadic template
考虑以下使用折叠表达式打印参数的函数。
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((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>()...>{};
}
考虑以下使用折叠表达式打印参数的函数。
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((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>()...>{};
}