A simple event-handler implementation

Hi,everyone
I just wrote a simple implementation of event-handler.
The implementation is straight and simple and i’m simply opening the subject for discussion a better implementation.

Here is my code:
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

template <typename T>
class Action {
private:
    typedef std::function<void(T)> EventHandler;
    typedef std::vector<EventHandler> EventHandlerList;
    std::map<int, EventHandlerList> m_handlers;
    
public:
    void addListener(int eventId, EventHandler listener){
        if(hasEvent(eventId)){
            EventHandlerList& list = m_handlers.at(eventId);
            list.push_back(listener);
        }else{
            std::vector<EventHandler> list;
            list.push_back(listener);
            m_handlers.insert(std::make_pair(eventId, list));
        }
    }
    
    void emitEvent(int eventId,T value){
        if(hasEvent(eventId)){
            EventHandlerList& list = m_handlers.at(eventId);
            for(auto & func : list){
                func(value);
            }
        }else{
            std::cout << "cannot find eventId" << eventId << std::endl;
        }
    }
    
    bool hasEvent(int eventId){
        return m_handlers.find(eventId)!=m_handlers.end();
    }
};

template <typename T, typename E>
class ActionTwo {
private:
    typedef std::function<void(T,E)> EventHandler;
    typedef std::vector<EventHandler> EventHandlerList;
    std::map<int, EventHandlerList> m_handlers;
    
public:
    void addListener(int eventId, EventHandler listener){
        if(hasEvent(eventId)){
            EventHandlerList& list = m_handlers.at(eventId);
            list.push_back(listener);
        }else{
            std::vector<EventHandler> list;
            list.push_back(listener);
            m_handlers.insert(std::make_pair(eventId, list));
        }
    }
    
    void emitEvent(int eventId,T param1,E param2){
        if(hasEvent(eventId)){
            EventHandlerList& list = m_handlers.at(eventId);
            for(auto & func : list){
                func(param1,param2);
            }
        }else{
            std::cout << "cannot find eventId" << eventId << std::endl;
        }
    }
    
    bool hasEvent(int eventId){
        return m_handlers.find(eventId)!=m_handlers.end();
    }
};

template <typename T, typename E,typename F>
class ActionTuple {
private:
    typedef std::function<void(T,E,F)> EventHandler;
    typedef std::vector<EventHandler> EventHandlerList;
    std::map<int, EventHandlerList> m_handlers;
    
public:
    void addListener(int eventId, EventHandler listener){
        if(hasEvent(eventId)){
            EventHandlerList& list = m_handlers.at(eventId);
            list.push_back(listener);
        }else{
            std::vector<EventHandler> list;
            list.push_back(listener);
            m_handlers.insert(std::make_pair(eventId, list));
        }
    }
    
    void emitEvent(int eventId,T param1,E param2,F param3){
        if(hasEvent(eventId)){
            EventHandlerList& list = m_handlers.at(eventId);
            for(auto & func : list){
                func(param1,param2,param3);
            }
        }else{
            std::cout << "cannot find eventId" << eventId << std::endl;
        }
    }
    
    bool hasEvent(int eventId){
        return m_handlers.find(eventId)!=m_handlers.end();
    }
};

Last edited on
Topic archived. No new replies allowed.