Ton*_*ion 10 c++ parameters variadic-templates c++11
在Andrei关于GoingNative 2012的演讲中,他讨论了Variadic模板,并且他在一个方面解释了参数包扩展如何工作的示例.作为这个主题的新手,我发现很难理解每个案例的工作原理,有人可以解释一下扩展在每个函数调用中的工作原理gun吗?
template<class... Ts> void fun(Ts... vs) {
gun(A<Ts...>::hun(vs)...);
gun(A<Ts...>::hun(vs...));
gun(A<Ts>::hun(vs)...);
}
Run Code Online (Sandbox Code Playgroud)
ken*_*ytm 10
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))
Run Code Online (Sandbox Code Playgroud)
2.
gun(A<Ts...>::hun(vs...))
=> gun(A<T1, T2, …, Tn>::hun(vs...))
=> gun(A<T1, T2, …, Tn>::hun(v1, v2, …, vm))
Run Code Online (Sandbox Code Playgroud)
这应该是显而易见的.
3.
gun(A<Ts>::hun(vs)...)
=> gun(A<T1>::hun(v1), A<T2>::hun(v2), …, A<Tn>::hun(vn))
Run Code Online (Sandbox Code Playgroud)
(在这种情况下,如果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)
Run Code Online (Sandbox Code Playgroud)
如果存在嵌套扩展,则最内层的模式将首先扩展.因此,在情况1中,模式Ts将首先扩展为T1, T2, …, Tn.然后,外前的图案...是A<T1, T2, …, Tn>::fun(vs)-注意,Ts已经膨胀-因此它将扩展到A<T1, T2, …, Tn>::fun(v1), A<T1, T2, …, Tn>::fun(v2), …, A<T1, T2, …, Tn>::fun(vm)通过取代v1,v2等进入vs.
KennyTM的答案是完美的.我也喜欢样品.但由于他的答案是抽象的,我不觉得在他的答案中添加演示是正确的.所以他的答案的演示就在这里.我假设他的回答是正确的,我自己一无所知.(如果你赞成这一点,也可以投票支持他)
显然,这只是显示扩展状态的所有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")
);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1044 次 |
| 最近记录: |