次のシグネチャを持つオーバーロード関数があります。
void Foo(const std::function<void(int )> &func);
void Foo(const std::function<void(int, int)> &func);
そして、ラムダで Foo() を使用したい場合は、次のようにする必要があります。
Foo((std::function<void(int )>) [] (int i ) { /* do something */ });
Foo((std::function<void(int, int)>) [] (int i, int j) { /* do something */ });
どちらもあまりユーザーフレンドリーではありません。次のように、ラムダの前にキャスト "(std::function<...>)" を追加しなくても、関数を使用する方がはるかに簡単です。
Foo([] (int i ) { /* do something */ }); // executes the 1st Foo()
Foo([] (int i, int j) { /* do something */ }); // executes the 2nd Foo()
したがって、引数としてラムダを受け入れ、ラムダを上記のシグネチャのいずれかに自動的にキャストする別のオーバーロードが必要です。これはどのように行うことができますか?それとも、そもそも可能ですか?
template <typename Function> void Foo(Function function) {
// insert code here: should be something like
// - check the signature of the 'function'; and
// - call 'Foo()' corresponding to the signature
}
助けてください。
PS。私はVS2010を使用しています。