以下のことができればよかったです。
template <class RT, class... PT>
class Event
{
...
void operator()(PT... args)
{
std::for_each(
l.begin(), l.end(), [args...](Handler *p) { (*p)(args...); }
);
}
...
};
残念ながら、g++ 4.7.2 (-std=c++0x) でコンパイルできませんでした:
evtempl.hh: メンバー関数 'void elt::Event::operator()(PT ...)': evtempl.hh:75:54: エラー: '...' トークン evtempl.hh の前に ',' が必要です:75:54: エラー: '...' トークンの前に予期される識別子evtempl.hh: ラムダ関数内: evtempl.hh:76:26: エラー: 展開パターン 'args' に引数パックが含まれていません evtempl.hh: 'void elt::Event::operator()(PT ... のインスタンス化内) ) [RT = 無効; PT = {int}]': testevtempl.cc:28:9: ここから必要です evtempl.hh:74:9: エラー: 無効なフィールドを使用しています 'elt::Event::operator()(PT ...):: ::Handler*)>::__args' evtempl.hh: 'void elt::Event::operator()(PT ...) のインスタンス化 [with RT = void; PT = {int, const char*}]'
代わりに、そのラムダを古い平凡な構文に変更する必要があります。
for (itr = l.begin(); itr != l.end(); ++itr)
(*(*itr))(args...);
これはコンパイルして正常に動作します。
なぜラムダ構文が機能しないのだろうか。
- 私は何か間違ったことをしたか、何かを見逃しましたか?
- そのようなことはc ++ 11標準で禁止されていますか?
- または、これは標準で許可されていますが、現在のコンパイラの問題ですか?
私は試した
[=](Handler *p) { (*p)(args...); }
次の場合と同じエラーが発生します。
[args](Handler *p) { (*p)(args...); }
パラメータパックが展開されていないと不平を言う