Fai*_*ali 4 c++ lambda variadic-templates c++11
任何人都可以向我确认在C++ 11中允许使用以下代码(包括函数参数包的嵌套扩展)(我当然感谢任何对该标准的引用):
template<class ... VFTs> int variadic_fun(VFTs ... vfts) {
return sizeof ...(vfts);
}
template<int ... Ns> struct IntPack {
template<class ... MemTs> static int variadic_memfun(MemTs ... MemArgs) {
return variadic_fun(([=]() {
cout << "MemArgs = " << MemArgs << "\n";
cout << "Ns = " << Ns;
// Note the nested expansion of MemArgs here:
cout << "variadic_fun(MemArgs...) = " << variadic_fun(MemArgs ...) << "\n";
cout << "MemArgs[Ns] = " << MemArgs[Ns] << "\n";
return 0;
})()...);
}
};
int main() {
IntPack<0, 1, 2>::variadic_memfun("123", "ABC", "XYZ");
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
PS因为有人在下面问过,这段代码适用于我实现通用lambdas的clang补丁(还不是标准的C++,还只是一个提议) - 我没有尝试过任何其他编译器 - 我不确定它是否适用于最新版本clang trunk目前(它可能会) - 我当然欢迎任何有关它是否与任何实现可变参数和lambda的主流编译器编译的信息.
是的,这是有效的,Clang支持它.
$ clang++ your-example.cpp -std=c++11
$ ./a.out
MemArgs = 123
Ns = 0variadic_fun(MemArgs...) = 3
MemArgs[Ns] = 1
MemArgs = ABC
Ns = 1variadic_fun(MemArgs...) = 3
MemArgs[Ns] = B
MemArgs = XYZ
Ns = 2variadic_fun(MemArgs...) = 3
MemArgs[Ns] = Z
Run Code Online (Sandbox Code Playgroud)
相关规则是[temp.variadic] p5:
未展开的参数包名称的外观是不正确的.
这不适用于这种情况,因为
名称显示在包扩展模式中的参数包将通过该包扩展进行扩展.
...并且lambda中包的使用在函数参数包扩展的模式内.
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |