首页 > 解决方案 > 传递成员函数作为参数

问题描述

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

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是虚拟的。

标签: c++oop

解决方案


你正在做一些奇怪的,C-ish 的事情。使用 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调用更有效。否则按价值捕获。


什么是 C++11 中的 lambda 表达式?


推荐阅读