在C ++中分配回调函数

时间:2016-02-02 15:11:16

标签: 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中,我试图像这样为它分配回调函数。

FileB.h

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

FileB.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函数不是静态的。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

  

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

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