我可以使用lambda函数或std :: function对象代替函数指针吗?

Mic*_*cci 12 c++ lambda function-pointers callback

我有一个我需要使用的库,它定义了以下内容:

typedef void CallbackFunction(const int& i);
Run Code Online (Sandbox Code Playgroud)

并具有注册回调的功能,如下所示:

void registerCallback(CallbackFunction* pCallback);
Run Code Online (Sandbox Code Playgroud)

因为我想捕获要在回调中使用的几个变量的状态,所以我不能简单地使用普通函数.我更喜欢使用的是lambda函数,但以下内容不能编译:

auto fCallback = [](const int& i) {
    cout << i << endl;
};
registerCallback(fCallback);
Run Code Online (Sandbox Code Playgroud)

相反,我得到错误:

error C2664: 'registerCallback' : cannot convert parameter 1 from '`anonymous-namespace'::<lambda0>' to 'CallbackFunction (__cdecl *)'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Run Code Online (Sandbox Code Playgroud)

我一直在阅读这个主题很多,并尝试了一些不同的(可能是愚蠢的)方法,但我似乎无法让这个工作.转换函数允许代码编译,但(毫不奇怪)它崩溃了.可能是我在StackOverflow或其他地方忽略了解决方案,所以链接就足够了.(虽然,因为我对这些技术有点新,所以请确保新手的通信清晰.例如,如果这个对话包含我的答案,我不明白.请简化或解释对应.)仅供参考,我正在使用Visual C++ 2010.

如果我能做些什么来澄清我的问题,请告诉我.在此先感谢您的帮助!

Dan*_*her 8

通常,不能使用需要函数指针的lambda或函数对象.函数对象是已经过载应用程序运算符(())的完整对象,因此您可以在语法上将它们用作函数.

标准算法被编写为模板,允许您将函数地址(指针)或函数对象传递给它们,因为它们使用相同的语法.传递函数对象时,会实例化一个接受该函数对象的模板; 传递函数指针时,会实例化不同的模板.

因此,要使lambda/function对象与代码一起使用,您需要修改正在使用的库.

  • 这实际上只是部分正确.Lambda表达式,因为它们将在C++ 0x中工作,具有隐式转换函数,用于函数指针IFF,它们不捕获任何范围.VS2010没有实现此功能,因为它是在发布该编译器之后发布的. (6认同)

Edw*_*nge 7

由于你什么都没有捕获,你应该能够做你想要做的事情,即将lambda表达式指定为函数指针(尽管你的语法错误).

既然您正在使用VS2010,那么您将无法使用.你试图使用的lambda的特性直到VS2010发布之后才出现:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3043.html

所以虽然是,它应该工作实际上没有.

当然,事实上,虽然你并没有捕捉任何你想做的事情.即使在C++草案标准的VS2010后状态下,捕获数据的Lambda也无法转换为函数指针.