如何在对象上获取一个方法,以便将其作为C样式回调传递

How to curry a method on an object for passing it as a C-style callback?

本文关键字:回调 样式 方法 对象 获取 一个      更新时间:2023-10-16

假设我们有以下类A:

class A
{
  public:
    void sum(int x);
};

我们有一个函数f,它得到一个C风格的回调,其中有一个类型为int的参数,并调用它:

typedef void (*Callback)(int);
void f(Callback cb)
{
    cb(5);
}

C++中是否有任何方法可以在类型为A的对象上编写方法A::print并将其传递给函数f?类似这样的东西:

void main()
{
    A a;
    auto curry_a = ??; // something like curry_a = [&](int x) { a.sum(x) };
    f(curry_a);
}

std::bind和lambda函数不是一个解决方案,因为它们使用重载的operator()创建类型为std::function<>的对象。它看起来像C++中的currying,但在我的情况下不能使用它。我需要一个真正的函数指针,即实时生成代码。

你运气不好,无法以令人满意的方式完成:唯一与C兼容的函数指针是函数(或类函数,但不是实例函数)。

因此,您必须创建一个修复参数的函数,例如成员函数的this。设置此参数的唯一方法是通过全局变量:

A *instance;
void (A::*a_fun)(int);
void applicator(int arg) { instance->*a_fun(arg); }
//...
int main() {
  A a;
  instance = &a;
  a_fun = &A::sum;
  f(applicator);
  // ...

这是通过全局变量为普通函数提供上下文的唯一方法。