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

标签 c++ callback function-pointers lambda

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

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/

相关文章:

c++ - Intel 编译器 (C++) 问题与 std::vector 上的 OpenMP 缩减

android - notifyDataSetChanged 后 "The specified child already has a parent"

javascript - 回调不是函数: what am i doing wrong?

c++ - std::function 到成员函数

c++ - 错误:纯虚拟方法称为

c++ - 如何实现高效的二维批处理?

c++ - C++ 编译时的 Fizz-Buzz

php - 如何将 call_user_func 用于静态类方法?

c++ - 如何声明模板化函数以便可以在类构造函数/函数中传递

c++ - pcap_loop中的回调方法