Variadic模板包扩展
Variadic Templates pack expansions
在Andrei关于GoingNative 2012的演讲中,他谈到了Variadic Templates,并通过下面的例子解释了参数包展开的工作原理。作为这个主题的新手,我发现很难理解每种情况是如何工作的,有人能解释一下扩展是如何在gun
的每个函数调用中工作的吗?
template<class... Ts> void fun(Ts... vs) {
gun(A<Ts...>::hun(vs)...);
gun(A<Ts...>::hun(vs...));
gun(A<Ts>::hun(vs)...);
}
1。
gun(A<Ts...>::hun(vs)...)
=> gun(A<T1, T2, …, Tn>::hun(vs)...)
=> gun(A<T1, T2, …, Tn>::hun(v1),
A<T1, T2, …, Tn>::hun(v2),
…,
A<T1, T2, …, Tn>::hun(vm))
2.
gun(A<Ts...>::hun(vs...))
=> gun(A<T1, T2, …, Tn>::hun(vs...))
=> gun(A<T1, T2, …, Tn>::hun(v1, v2, …, vm))
这应该是显而易见的。
3.
gun(A<Ts>::hun(vs)...)
=> gun(A<T1>::hun(v1), A<T2>::hun(v2), …, A<Tn>::hun(vn))
(在这种情况下,如果Ts和vs的长度不同,程序将不会编译)
...
将展开其前面的模式(包括任何参数包),这意味着在foo(Ts, Us, Vs)...
中,列表Ts
、Us
、Vs
(在锁定步骤中枚举)的每个成员都将被替换到该模式中,并且将形成逗号分隔的列表:
foo(Ts, Us, Vs)...
=> foo(T1, U1, V1), foo(T2, U2, V2), …, foo(Tn, Un, Vn)
如果有嵌套展开,最里面的模式将首先展开。因此,在情况1中,图案Ts
将首先被扩展为T1, T2, …, Tn
。然后,外部...
之前的模式是A<T1, T2, …, Tn>::fun(vs)
——注意,Ts
已经扩展了——所以它将通过将v1
、v2
等替换为vs
来扩展为A<T1, T2, …, Tn>::fun(v1), A<T1, T2, …, Tn>::fun(v2), …, A<T1, T2, …, Tn>::fun(vm)
。
显然,这都是psudocode,只是显示扩展状态。
void foo<void*,int,char,std::string>(nullptr, 32, '7', "BANANA") {
//gun(A<Ts...>::hun(vs)...);
gun(A<void*,int,char,std::string>::hun(nullptr)
,A<void*,int,char,std::string>::hun(32)
,A<void*,int,char,std::string>::hun('7')
,A<void*,int,char,std::string>::hun("BANANA")
);
//gun(A<Ts...>::hun(vs...));
gun(A<void*,int,char,std::string>::hun(nullptr, 32, '7', "BANANA");
//gun(A<Ts>::hun(vs)...);
gun(A<void*>::hun(nullptr)
,A<int>::hun(32),
,A<char>::hun('7'),
,A<std::string>::hun("BANANA")
);
}
相关文章:
- 嵌套参数包扩展失败
- [temp.variadic]中关于包扩展实例化的措辞
- 模板参数部分中有关包扩展的一些混淆
- 可变参数函数参数包扩展
- c++非类型参数包扩展
- C++别名的模板参数包扩展
- 如何将参数包扩展为向量<any>
- 模板包扩展以将函数应用于连续的参数对
- C++参数包扩展
- 如何为原生UI工具包扩展Ranorex?
- 折叠表达式、参数包扩展、类成员函数中的递归
- "如果 constexpr",在 lambda 内部,在包扩展内部 - 编译器错误?
- 折叠表达式扩展包中的最大元素数
- GCC vs CLANG:将捕获的参数包扩展两次
- 未使用模板类型定义的同时参数包扩展错误
- 构造仪的类模板参数包扩展
- 使用参数包扩展生成constexpr
- 如何"duplicate"模板参数包扩展?
- 模板.参数包扩展 - 重映射类型
- 哪个编译器(如果有的话)在参数包扩展中存在错误