ラムダ式を受け取るテンプレート化された関数がある場合、異なる数の引数を取るラムダ式で機能するように特殊化するにはどうすればよいですか? 次のコードが機能します。
template<typename Lambda>
void doSomething(Lambda callback)
{
callback();
}
doSomething([] () { /* some code here */ } );
しかし、次のように呼び出すこともできるようにしたい場合:
doSomething([&foo] (int x) { /* some code here */ } );
doSomething([&foo] (int x, int y) { /* some code here */ } );
doSomething() の特殊なバージョンを提供するために使用する構文は何ですか? この構文:
template<>
void doSomething<[] (int)>([] (int) callback)
{
callback(3);
}
は Visual Studio 2012 でコンパイルされず、有効な構文がどのようになるかについての参照を見つけることができませんでした。出来ますか ?または、 doSomething() 内から、提供されたコールバックが受け取る引数の数を確認して、次のようなことができるようにすることは可能ですか?
template<typename Lambda>
void doSomething(Lambda callback)
{
int numArgs = ???
switch (numArgs) {
case 0: callback(); break;
case 1: callback(1); break;
case 2: callback(1,2); break;
}
}