【发布时间】:2018-05-31 04:58:32
【问题描述】:
我正在尝试用 c 创建一个非常简单的事件系统。我的界面是这样的:
typedef struct EventEmitter EventEmitter;
EventEmitter* emitter_create();
void emitter_subscribe(EventEmitter* emitter, void (*cb)(void*));
void emitter_publish(EventEmitter* emitter, void *payload);
一切正常,但是为了注册一个事件监听器,我需要提供一个函数指针,它接受一个 void *。
static void registerOnKeyDown(void (*cb)(void*)) {
emitter_subscribe(keyDownEmitter, cb);
}
static void registerOnKeyUp(void (*cb)(void*)) {
emitter_subscribe(keyUpEmitter, cb);
}
是否有任何方法,使用宏或其他方式,允许 EventEmitters 的用户提供类型化回调?比如:
void onKey(int keyCode) {
printf("%d", keyCode);
}
代替:
void onKey(void *keyCode) {
int code = (int)keyCode;
printf("%d", code);
}
【问题讨论】:
-
你觉得宏在这里有什么帮助?据我所知,你只有一个订阅功能,所以最终一切都必须遵守它的界面。
-
我真的不知道。我是 c 的新手。我不确定是否有某种方法可以使订阅函数成为考虑类型的宏。即使我要这样做,我也不确定在发布事件时如何知道类型。
-
是什么让您无法将第二个原型用于回调函数?
-
你这是什么意思?
-
void onKey(void *keyCode)没有错你不必用void onKey(int keyCode)