的考虑下面的辅助功能理由模板参数包扩展语法
template <typename ... Ts>
auto f(Ts&& ... args) {}
template <typename T>
auto g(T x) { return x; }
1)我们展开一个模板参数包如常。
template <typename ... Ts>
void test1(Ts&& ... args)
{
f(args...);
}
2)这里膨胀...
的g()
函数调用后发生。这也是合理的,因为g()
被称为与每个args
:
template <typename ... Ts>
void test2(Ts&& ... args)
{
f(g(args)...);
}
3)用同样的逻辑我希望test3(Is, args...)...
,但没有。你必须写test3(Is..., args...)
:
template <typename ... Ts>
void test3(size_t i, Ts&& ... args)
{
f(args...);
}
template <typename ... Ts>
void test3(std::index_sequence<Is...>, Ts&& ... args)
{
// would expect test3(Is, args...)...;
test3(Is..., args...);
}
我知道,我使用它,但好了,我不明白这一点。模板扩展的整个概念是表达式折叠的一种形式。不是用C++ 17的方式,而是从...
之前的子表达式被折叠(或者如果你喜欢的话重复)关于可变参数。在test3
的情况下,我们相对于Is
“折叠”表达式test3(Is, args...)
。然而,我们必须编写test3(Is..., args...)
而不是test3(Is, args...)...
。
有了这个奇怪的标准逻辑,你也可以写f(g(args...))
而不是f(g(args)...)
- 但是这是无效的。看起来语言在不同的上下文中使用不同的逻辑。
不同语法背后的基本原理是什么?
无法使用参数包扩展,而无需使用[技巧](http://stackoverflow.com/链通话a/17340003/1794345) – Rerito
@Rerito谢谢,但我知道这一招。不幸的是,这并没有回答这个问题。 – plasmacel