将成员函数作为参数传递

时间:2019-08-25 00:02:34

标签: c++ oop

我有一个运行回调的函数:

void run_callback(void(*callback)(uint32_t)) {
    callback(100);
}

这适用于静态函数,

void global_callback(uint32_t);

int main() {
    run_callback(global_callback);
}

但没有成员函数。

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

int main() {
    A foo;
    run_callback(foo.callback);
}

我使用静态包装函数来解决此问题。

void run_member_callback(void* obj, void(*callback)(void*,uint32_t)) {
    callback(obj, 100);
}

class B {
    int x;
  public:
    static void static_callback(void* obj, uint32_t value) {
        static_cast<B*>(obj)->callback(value);
    }
    void callback(uint32_t);
};

int main() {
    B foo;
    run_member_callback(&foo, foo.static_callback);
}

有没有简单的方法可以将成员函数作为参数传递?

编辑: 我正在尝试避免使用STL,并且由于我的run_callback的实现是虚拟的,因此无法选择模板。

1 个答案:

答案 0 :(得分:3)

您正在做一些奇怪的C类事情。使用C ++功能。我个人将使用run_callback的模板和lambda来传递成员函数:

template <class F>
void run_callback(F callback)
{
    callback(100);
}

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

int main()
{
    A foo{};
    run_callback([&](uint32_t a) { return foo.callback(a); });
}

如果您通过引用捕获对象,请当心run_callback调用之后。否则按值捕获它。


What is a lambda expression in C++11?