我正在尝试对以下情况进行编码:我有一个基类,它提供了一个用于处理事件的框架。我正在尝试为此使用一组指向成员函数的指针。它如下:
class EH { // EventHandler
virtual void something(); // just to make sure we get RTTI
public:
typedef void (EH::*func_t)();
protected:
func_t funcs_d[10];
protected:
void register_handler(int event_num, func_t f) {
funcs_d[event_num] = f;
}
public:
void handle_event(int event_num) {
(this->*(funcs_d[event_num]))();
}
};
然后用户应该从这个派生其他类并提供处理程序:
class DEH : public EH {
public:
typedef void (DEH::*func_t)();
void handle_event_5();
DEH() {
func_t f5 = &DEH::handle_event_5;
register_handler(5, f5); // doesn't compile
........
}
};
此代码无法编译,因为 DEH::func_t 无法转换为 EH::func_t。这对我来说很有意义。在我的情况下,转换是安全的,因为下面的对象this
实际上是 DEH。所以我想要这样的东西:
void EH::DEH_handle_event_5_wrapper() {
DEH *p = dynamic_cast<DEH *>(this);
assert(p != NULL);
p->handle_event_5();
}
然后代替
func_t f5 = &DEH::handle_event_5;
register_handler(5, f5); // doesn't compile
在 DEH::DEH() 放
register_handler(5, &EH::DEH_handle_event_5_wrapper);
所以,最后的问题(花了我足够长的时间......):有没有办法EH::DEH_handle_event_5_wrapper
自动创建这些包装器(如)?或者做类似的事情?这种情况还有哪些其他解决方案?
谢谢。