在C++中分配回调函数

Assigning callback function in C++

本文关键字:回调 函数 分配 C++      更新时间:2023-10-16

这个问题介于理论和实践之间。

我有一个C文件(我们称之为fileA.c和fileA.h)

fileA.h 定义一个结构如下:

typedef struct
{
    /** Callback function which is called upon an event occurrence */
    void (*FileAcb)(MyEvent event, uint8 val);
} MyStruct;

在 fileB.cpp 和 fileB.h 中,我尝试像这样为其分配回调函数。

文件B.h

class FileB
{
    public:
        static void Callback(MyEvent event, uint8 val);
    protected:
        /**Protected members */
    private:
        /**Private members */
        MyStruct myStruct;
};

文件B.cpp

bool FileB::Start()
{
    myStruct.FileAcb= FileB::Callback;
    return true;
}
void FileB::Callback(MyEvent event, uint8 val)
{
    //do some stuff here.
}

这行得通。但是,我正在寻找一种写这行的方法:

myStruct.FileAcb= FileB::Callback;

以一种允许我的FileB::Callback函数不是静态的方式。有没有办法实现这一目标?

有没有办法实现这一目标?

不直接。传统的 C 样式方法是提供一个指向你的对象的void*参数,以及一个小的转发函数:

struct CallbackWithData
{
    void *closure;
    void (*callback)(void *closure, MyEvent event, uint8 val);
};
void ForwardToFileB(void *closure, MyEvent event, uint8 val)
{
    FileB *target = (FileB *)closure;
    target->Callback(event, val);
}

即使在非 OO 样式的 C 中,向回调函数提供这种参数也是传统的,因此它们有地方可以保存可能需要的任何状态。

执行此操作的类似C++方法是使用std::function<void(MyEvent,uint8_t)>而不是原始指针。