C ++中的EventEmitter类:侦听器和发射器

时间:2013-12-23 08:15:59

标签: c++ events design-patterns listener event-listener

我正在尝试实现一个允许侦听某些事件的类,当这些事件发出时,它们会收到通知。

所以我想使用Functors,

 class MyFunctor {
    public:     
        virtual void emit() {}
            vitual void compare() {} 
 };

 class MyFunctorSpecial : public MyFunctor {
    void (*)() ab;
    public:
    MyFunctorSpecial(void (*a)()) : ab(a) {}
    void emit() { ab(); }
 };
 class EventEmitter {
   std::map<std::string, std::vector<MyFunctor> > eventMap;
   public:
    void On(const std::string &, const MyFunctor &) {
        // add to the map
    }

    void Emit(const std::string & eventName) {
        // emit the event
        // for all listeners in the vector for this event-name
         // call the emit of them. 
    }
 };

 EventEmitter emitter;
 // some function - abc()
 MyFunctorSpecial funct(abc);
 emitter.On("hello", funct);
 emitter.Emit("hello");

但现在我想将参数传递给侦听器。像

 emitter.Emit("hello", 45, false);

我认为Emit()在编译时可以获得有关各种参数的数据类型的信息。我可以使用这些信息来实现,使用模板或其他任何东西。

如果这个问题有另一种模式?我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

您问题的常见设计模式称为Observer Design-Pattern

enter image description here

您所谓的“仿函数”不是仿函数。 如果是这样,他们将实现一个operator()方法,并且可以像函数一样被调用(因此名称为functor)。你的不是。

例如,这是一个仿函数:(注意运算符()

class MyFunctor 
{
    public:     
        void operator()(){};
};