最良の方法はstd::function
、正しいタイプのオブジェクトを明示的に作成してから、そのオブジェクトを関数に渡すことです。
std::function<void(int, int)> func =
[](int a, int b) { cout << "a: " << a << " b: " << b << endl; }
foo(func);
またはインライン:
foo(
std::function<void(int, int)>(
[](int a, int b) { cout << "a: " << a << "b: " << b << endl; }
));
std::function
何でも受け入れるコンストラクターテンプレートがあります。
template<class F> function(F);
このため、オーバーロードの解決中にコンパイラがfoo
どちらを選択するかを知る方法はありません。両方とも、ラムダ式を引数として取ることができるコンストラクタを持っていますstd::function<void(int)>
。std::function<void(int, int)>
std::function
オブジェクトを直接渡す場合std::function
、オーバーロードの解決時にはコピーコンストラクターが優先されるため、コンストラクターテンプレートの代わりにコピーコンストラクターが選択されます。
将来への回答: キャプチャリストが空であることが保証されている場合は、通常の関数ポインタを使用することもできます。C ++ 0xでは、キャプチャレスラムダは暗黙的に関数ポインタに変換可能です。だから、あなたは次のようなものを使うことができます
void foo(void (*t)(int, int)) { t(1, 2); }
void foo(void (*t)(int)) { t(1); }
foo
キャプチャレスラムダ(または一致する型の関数ポインタ)を使用して直接呼び出します。
この変換は、ドラフト言語標準(今年の2月に追加された)へのごく最近の追加であるため、まだ広くサポートされていない可能性があることに注意してください。Visual C++2010はまだサポートしていません。最新のg++についてはわかりません。