最好的方法是显式创建一个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)>
一个可以将您的 lambda 表达式作为参数的构造函数。
当您std::function
直接传递一个对象时,std::function
在重载决议期间首选复制构造函数,因此选择它而不是构造函数模板。
以后回答: 如果保证捕获列表为空,也可以使用普通函数指针。在 C++0x 中,无捕获 lambda 可隐式转换为函数指针。所以,你可以使用类似的东西
void foo(void (*t)(int, int)) { t(1, 2); }
void foo(void (*t)(int)) { t(1); }
并foo
直接使用无捕获 lambda(或具有匹配类型的函数指针)调用。
请注意,这种转换是语言标准草案的最新补充(它是在今年 2 月添加的),因此它不太可能得到广泛支持。Visual C++ 2010 还不支持它;我不知道最新的 g++。