…で、ファイナルアンサーだろうか。
確かに、何を基準に型を自動判別すればいいのかという基本的な疑問があります。ヘルパー関数というのはそのために作るのだろうか。
#include <iostream> class IEventHandler { public: virtual ~IEventHandler() {} virtual void operator()() const = 0; }; template <class T> class EventHandler : public IEventHandler { public: typedef void (T::*Method)(); private: T *object; Method method; public: EventHandler(T *object, Method method); virtual void operator()() const; }; template <class T> EventHandler<T>::EventHandler(T *object, Method method) : object(object), method(method) { } template <class T> void EventHandler<T>::operator()() const { (this->object->*this->method)(); } template <class T> IEventHandler *CreateEventHandler(T *object, typename EventHandler<T>::Method method) { return new EventHandler<T>(object, method); } class Unko { public: void geri(); }; void Unko::geri() { std::cout <<"下痢したぜ!" <<std::endl; } class Chinco { public: void daaa(); void daaa0000(); }; void Chinco::daaa() { std::cout <<"だぁぁぁぁ!" <<std::endl; } void Chinco::daaa0000() { std::cout <<"だぁぁぁぁああああああああああああ!" <<std::endl; } int main(int argc, char *argv[]) { IEventHandler *handlers[3]; Unko *unko = new Unko(); Chinco *chinco = new Chinco(); handlers[0] = CreateEventHandler(unko, &Unko::geri); handlers[1] = CreateEventHandler(chinco, &Chinco::daaa); handlers[2] = CreateEventHandler(chinco, &Chinco::daaa0000); for (int i = 0; i <(sizeof(handlers) / sizeof(IEventHandler *)); i++) { (*handlers[i])(); } for (int i = 0; i <(sizeof(handlers) / sizeof(IEventHandler *)); i++) { delete handlers[i]; } delete chinco; delete unko; return 0; }
ここでいう CreateEventHandler() 関数がそれです。こいつのおかげでクラスを作るのに型を指定しなくて良いようになっています。もちろん new EventHandler<Unko>(unko, &Unko::geri) って書けば良いんですけど、それが悔しい人向け。
余談ですが、イベントハンドラはスマートポインタに渡した方がいいんじゃねぇか論が熱いですね。
Contributions