在C++中分配回调函数
Assigning callback function in C++
这个问题介于理论和实践之间。
我有一个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)>
而不是原始指针。
相关文章:
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- 从不同的 cpp 调用回调函数会导致bad_function_call
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- C 回调函数在对象 pascal 上崩溃
- 类 Referention 中C++回调函数引用非静态函数
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 动态链接库中C++回调函数
- 我想制作设置鼠标回调函数,以便在仍然按下鼠标左键时连续传递坐标
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 我可以使用谷歌 v8 在回调函数中获取 JavaScript 函数C++源文本吗?
- 重写另一个方法 [C++] 使用的超类回调函数
- 是否可以影响 C++ 中回调函数的局部变量?
- C++ Qt5 中带有 pigpio 库的回调函数
- 在定时器回调函数中使用 Sleep() 会导致C++出现问题吗?
- C++在赋值或回调函数时重载模板
- 如何用不同的参数类型和数字回调函数
- 如何为Python Swigged C++对象创建和分配回调函数
- 用回调函数替换C++正则表达式
- C++带有回调函数的模板类