c++ - 在 C++ 中分配回调函数

标签 c++ callback theory

<分区>

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

我有一个 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 函数不是静态的方式。有办法实现吗?

最佳答案

Is there a way to achieve that?

不直接。 传统的 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)>而不是原始指针。

关于c++ - 在 C++ 中分配回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35157072/

相关文章:

c++ - 如何围绕任意点旋转一组二维形状

language-agnostic - 什么是图灵完备?

list - 列表和元组之间有区别吗?

logic - 系统的健全性和完整性

Javascript : Will a function call all callbacks for all functions that ever called it?

c++ - 函数不断返回相同的值

c++ - 如何将boost多精度整数从小端转换为大端?

c++ - 如何通过析构方法删除一个对象(类)

javascript - 如何将参数传递给 setTimeout() 回调?

php - 如何在类中实现回调方法 (PHP)