| 12
 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