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.
如果我能做些什么来澄清我的问题,请告诉我.在此先感谢您的帮助!
通常,不能使用需要函数指针的lambda或函数对象.函数对象是已经过载应用程序运算符(())的完整对象,因此您可以在语法上将它们用作函数.
标准算法被编写为模板,允许您将函数地址(指针)或函数对象传递给它们,因为它们使用相同的语法.传递函数对象时,会实例化一个接受该函数对象的模板; 传递函数指针时,会实例化不同的模板.
因此,要使lambda/function对象与代码一起使用,您需要修改正在使用的库.
由于你什么都没有捕获,你应该能够做你想要做的事情,即将lambda表达式指定为函数指针(尽管你的语法错误).
既然您正在使用VS2010,那么您将无法使用.你试图使用的lambda的特性直到VS2010发布之后才出现:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3043.html
所以虽然是,它应该工作实际上没有.
当然,事实上,虽然你并没有捕捉任何你想做的事情.即使在C++草案标准的VS2010后状态下,捕获数据的Lambda也无法转换为函数指针.