我有一个需要使用的库,它定义了以下内容:
typedef void CallbackFunction(const int& i);
并且有一个函数来注册你的回调,如下所示:
void registerCallback(CallbackFunction* pCallback);
因为我想捕获回调中要使用的几个变量的状态,所以我不能简单地使用普通函数。我更喜欢使用 lambda 函数,但以下内容无法编译:
auto fCallback = [](const int& i) {
cout << i << endl;
};
registerCallback(fCallback);
我得到了错误:
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
我一直在阅读这个主题,并尝试了一些不同的(可能是愚蠢的)方法,但我似乎无法让它发挥作用。强制转换函数允许代码编译,但(并不奇怪)它会崩溃。可能是我在 StackOverflow 或其他地方忽略了解决方案,所以一个链接就足够了。 (不过,由于我对其中一些技术有点陌生,请确保对应关系对于新手来说足够清楚。例如,如果 this conversation 包含我的答案,我不明白。请简化或解释通信。)仅供引用,我使用的是 Visual C++ 2010。
如果我能做些什么来澄清我的问题,请告诉我。提前感谢您的帮助!
最佳答案
一般来说,你不能在需要函数指针的地方使用 lambda 或函数对象。函数对象是完全成熟的对象,它们重载了应用程序运算符 (()
),因此您可以在语法上将它们用作函数。
标准算法被编写为模板,允许您将函数地址(指针)或函数对象传递给它们,因为它们使用相同的语法。当您传递一个函数对象时,会实例化一个接受该函数对象的模板;当你传递一个函数指针时,会实例化一个不同的模板。
因此,要让 lambdas/function 对象与您的代码一起使用,您需要修改您正在使用的库。
关于c++ - 我可以使用 lambda 函数或 std::function 对象代替函数指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4764590/