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誰かが以下に尋ねたので、このコードはジェネリックラムダを実装するclangの私のパッチで動作します(まだ標準のC ++ではなく、まだ提案にすぎません)-他のコンパイラで試したことはありません-最新のコンパイラで動作するかどうかはわかりません現在、clang トランク (おそらくそうです) - 変数とラムダを実装する主流のコンパイラのいずれかでコンパイルできるかどうかについての情報を歓迎します。

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です:

展開されていないパラメーターパックの名前の外観が正しくありません。

この場合、それは当てはまりません。

パック拡張のパターン内に名前が表示されるパラメーターパックは、そのパック拡張によって拡張されます。

...ラムダ内でのパックの使用は、関数の引数パック展開のパターン内にあります。

于 2013-01-29T04:02:00.300 に答える