gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:14:21 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com