我正在尝试在 C++ 应用程序中使用 C 库,并发现自己处于以下情况(我知道我的 C,但我对 C++ 还很陌生)。在 C 端,我有一组函数,它们将函数指针作为参数。在 C++ 方面,我有一个带有仿函数的对象,它与 C 函数所需的函数指针具有相同的签名。有什么办法可以将C++仿函数作为函数指针传递给C函数吗?
最佳答案
您不能直接将指向 C++ 仿函数对象的指针作为指向 C 代码的函数指针传递 (甚至是 C++ 代码)。
此外,为了可移植地将回调传递给 C 代码,至少需要声明它
作为 extern "C"
非成员函数。
至少,因为某些 API 需要特定的函数调用约定,因此
额外的声明修饰符。
在许多环境中,C 和 C++ 具有相同的调用约定,只有不同之处
在名称修改中,因此任何全局函数或静态成员都可以工作。
但是您仍然需要将对 operator()
的调用包装在一个普通函数中。
如果你的仿函数没有状态(它是一个对象只是为了满足一些正式的 要求等):
class MyFunctor { // no state public: MyFunctor(); int operator()(SomeType ¶m) const; }
你可以编写一个普通的 extern "C"函数来创建仿函数并执行它的 运算符()。
extern "C" int MyFunctorInC(SomeType *param) { static MyFunctor my_functor; return my_functor(*param); }
如果你的仿函数有状态,例如:
class MyFunctor { // Some fields here; public: MyFunctor(/* some parameters to set state */); int operator()(SomeType ¶m) const; // + some methods to retrieve result. }
和 C 回调函数采用某种用户状态参数(通常为 void *):
void MyAlgorithmInC(SomeType *arr, int (*fun)(SomeType *, void *), void *user_state);
您可以编写一个普通的 extern "C"函数,将其状态参数转换为 你的仿函数对象:
extern "C" int MyFunctorInC(SomeType *param, void *user_state) { MyFunctor *my_functor = (MyFunctor *)user_state; return (*my_functor)(*param); }
并像这样使用它:
MyFunctor my_functor(/* setup parameters */); MyAlgorithmInC(input_data, MyFunctorInC, &my_functor);
否则这是唯一正常的方法 (正常如“在运行时不生成机器代码”等) 是使用一些静态(全局)或线程本地存储来传递仿函数 到外部“C”函数。 这限制了您可以使用代码执行的操作,而且很丑陋但可以工作。
关于c++ - 将仿函数作为函数指针传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5807121/