4

任何人都可以为我确认以下代码(包括函数参数包的嵌套扩展)在 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");
}

谢谢!
PS 由于有人在下面问,这段代码适用于我的实现通用 lambda 的 clang 补丁(还不是标准 C++,仍然只是一个建议) - 我没有用任何其他编译器尝试过它 - 并且不确定它是否适用于最新的当前的clang trunk(它可能确实如此) - 我当然欢迎任何关于它是否与任何实现可变参数和lambdas的主流编译器一起编译的信息。

4

1 回答 1

6

是的,这是有效的,并且 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

相关规则是[temp.variadic]p5

未扩展的参数包名称的外观是不正确的。

这不适用于这种情况,因为

名称出现在包扩展模式中的参数包由该包扩展扩展。

...并且在 lambda 中使用 pack 是在函数参数 pack 扩展的模式内。

于 2013-01-29T04:02:00.300 回答