1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| #include <iostream>
#include <string>
#include <queue>
#include <functional>
#ifdef _MSC_VER
#include <memory>
#else
#include <tr1/memory>
#endif
struct I_Events_Base
{
virtual ~I_Events_Base()=0;
void execute() const
{
do_execute();
}
private:
virtual void do_execute() const=0;
};
I_Events_Base::~I_Events_Base(){}
template<class T>
struct T_Events : public I_Events_Base
{
T_Events(T action_,std::string comment_)
:action(action_),comment(comment_)
{}
private:
void do_execute () const
{
std::cout<<"executing "<<comment<<std::endl;
action();
}
T action;
std::string comment;
};
template<class T>
std::tr1::shared_ptr<T_Events<T> >
make_event(T action_, std::string comment_)
{
return std::tr1::shared_ptr<T_Events<T> >(new T_Events<T>(action_,comment_));
}
struct Mouse_Event
{
Mouse_Event(std::string event_, int x_pos_, int y_pos_)
:m_event(event_),m_x_pos(x_pos_),m_y_pos(y_pos_)
{}
void operator()()const
{
std::cout<<"Mouse Event : "<<m_event<<" ( "<<m_x_pos<<" , "<<m_y_pos<<" )"<<std::endl;
}
private:
std::string m_event;
int m_x_pos;
int m_y_pos;
};
struct Key_Event
{
Key_Event(std::string key_)
:m_key(key_)
{}
void operator()()const
{
std::cout<<"Key Event : "<<m_key<<std::endl;
}
private:
std::string m_key;
};
void event_dummy()
{
std::cout<<"dummy event "<<std::endl;
}
int main()
{
std::queue<std::tr1::shared_ptr<I_Events_Base> >event_queue;
event_queue.push(
make_event(
Mouse_Event("left_button",10,10),
"mouse event"
)
);
event_queue.push(
make_event(
Key_Event("l"),
"key event"
)
);
event_queue.push(
make_event(
event_dummy,
"dummy event"
)
);
while(!event_queue.empty())
{
event_queue.front()->execute();
event_queue.pop();
}
return 0;
} |
Partager