gpt4 book ai didi

c++ - 将仿函数作为函数指针传递

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

我正在尝试在 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 &param) 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 &param) const;
    // + some methods to retrieve result.
    }

    C 回调函数采用某种用户状态参数(通常为 void *):

    void MyAlgorithmInC(SomeType *arr,
    int (*fun)(SomeType *, void *),
    void *user_state);

    您可以编写一个普通的外部“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/1840029/

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