如何在对象上讨论一个方法,将其作为C风格的回调传递?

时间:2015-07-01 06:47:53

标签: c++ object callback currying

假设我们有以下课程A

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

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

typedef void (*Callback)(int);

void f(Callback cb)
{
    cb(5);
}

在C ++中是否有办法在类型为A::print的对象上讨论方法A并将其传递给函数f?像这样:

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

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

1 个答案:

答案 0 :(得分:2)

你运气不好,不能以令人满意的方式完成:唯一恰恰是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);
  // ...

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