c++ - 如何使用无类型函数指针调用 C++ 成员函数

标签 c++ function-pointers

我正在尝试创建 C++ Timer 模块,并计划将回调函数传递给我的 API。这样,不同的模块可以注册一个回调,当发生超时时我可以通知它。 在 C 中使用简单的函数指针很容易做到这一点,但在 C++ 中我们如何传递现有实例的成员函数。因为当timer调用callback(member)方法时,我需要访问member(this指针)。

有很多示例知道要调用的对象的类型,但我正在创建一个通用模块,因此我没有更改为成员转换为确切类型。

我没有使用旧版嵌入式软件的 C++11 这么旧的版本。

我的 API 可能是

void (*TimerCallback)(void);

Timer::TimerCallback userCB;

Timer::Timer(TimerCallback cb) {
    userCB = cb;
}

void Timer::invoke() {
    userCB();
}

让我们假设我有一个需要计时器的 C++ 类

class myModule {
private:
    Timer* timer;
    void timerCallbackFunc(void) { 
      count << "This " << this << endl; 
    }
public:
    myModule() {
        timer = new Timer(timerCallbackFunc);
    }
}

但是我找不到任何方法来使用所有者的 this 指针调用成员函数,因此无法访问成员字段。

C++有什么办法或者限制吗?

谢谢。

最佳答案

看来您需要一些简单的东西,而不是在 C++03 中重新发明 C++11。

因此,请考虑将客户端代码的状态指针 传递给回调的旧 C 风格回调。客户端代码可以像这样:

timer = new Timer( timerCallback, this );

并且在回调中(一个普通的命名空间作用域函数,或 static 类成员)它以 void* 的形式返回 this 参数它必须正确转换,然后调用非 static 成员函数。

关于c++ - 如何使用无类型函数指针调用 C++ 成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49454299/

相关文章:

c++ - 对不同参数执行相同操作的函数

c - 结构和函数的段错误

c++ - ScopedExit 实现 : pass arguments to the function object

function-pointers - 在 javascript 中,定义内联函数与将其作为引用传递有何权衡?

c++ - 使用 boost::python 调用一个带有指向数组的指针的 C++ 函数

c++ - 自动跳过/忽略 gdb 中的外部代码

c - 函数指针和函数地址

c - c中回调寄存器函数中userdata有什么用?

c++ - boost::phoenix 与 VS2008

c++ - 用 std/tr1/boost::array 替换内置数组总是安全的吗?