次の状況をコーディングしようとしています。イベントを処理するためのフレームワークを提供する基本クラスがあります。そのために、メンバー関数へのポインターの配列を使用しようとしています。次のようになります。
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
)を自動的に作成する方法はありますか?または同様のことをするために?この状況に対する他の解決策はありますか?
ありがとう。