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
|
#include <functional>
#include <unordered_map>
#include <iostream>
#include <string>
#include <vector>
class Evenement
{
public :
Evenement(){}
std::string even;
std::string show(){std::cout<<even; return even;}//Ne sert qu'a titre d'exemple
};
class Callback
{
private :
std::function<void(Evenement*)> function;
public :
Callback(std::function<void(Evenement*)> fc)
{
function=fc;
}
void operator()(Evenement*even)
{
function(even);
}
};
using namespace std;
class Object
{
private :
std::unordered_map<std::string,std::vector<Callback>>Callbacks;
bool has_key(std::string key)
{
if(Callbacks.find(key)==Callbacks.end())
return false;
return true;
}
void handle_event(std::string key, Evenement*even)
{
std::vector<Callback>&vect=Callbacks[key];
for(unsigned int i=0;i<vect.size();i++)
vect[i](even);
}
public :
void emit(std::string key, Evenement* even=NULL)
{
if(even)
even->even=key;
handle_event(key,even);
}
bool add_event(std::string key, Callback fc)
{
if(has_key(key))
{
std::vector<Callback>& vect=Callbacks[key];
vect.push_back(fc);
return false;
}
else
{
std::vector<Callback> vect(1,fc);
Callbacks.insert(pair<std::string,std::vector<Callback>>(key,vect));
return true;
}
}
#define make_callback(a,...) Callback([__VA_ARGS__](Evenement*even){a})
#define REF(a) &a
};
int main()
{
Object a;
std::string tmp="truc";
Evenement even;
a.add_event("show",make_callback
(even->show();tmp="chose";,REF(tmp)));
a.emit("show",&even);
std::cout<<"\n"<<tmp;
return 0;
}} |
Partager