通用分派器类

Generic dispatcher class

本文关键字:分派      更新时间:2023-10-16

我试图写一个类,做事件(或任何)调度在一个通用的方式。模板形参是事件监听器的类型、作为参数传递的事件类型,以及要在监听器上调用的函数(成员函数)。这是类定义:

template<class L, class E, void (L::*F)(const E&)>
class Dispatcher {
  public:
     typedef L ListenerType;
     typedef E EventType;
     Dispatcher ();
     virtual ~Dispatcher ();
     void addListener(ListenerType* listener);
     void removeListener(ListenerType* listener);
     void dispatch (const EventType& event);
  protected:
     std::vector<ListenerType*> mListeners;
};

调度方法的定义:

template<class L, class E, void (L::*F)(const E&)>
void Dispatcher<L, E, F>::dispatch (const EventType& event) {
     for (int i = 0; i < mListeners.size(); ++i) {
        if(mListeners[i]) {
           (mListeners[i]->*F)(event);
        }
     }
}

最后是测试用例:

struct E {
   unsigned int count;
};
class A {
   public:
      void fun(const E& e) {
         std::cout << "Count = " << e.count;
      }
};
int main (int argc, char** argv) {
   Dispatcher<A, E, &A::fun> disp;
   A a;
   E e;
   e.count = 10;
   disp.addListener(&a);
   disp.dispatch(e);
   return 0;
}

我不明白的是,它按预期运行,输出"Count = 10",但编译器状态:

..bcore/Dispatcher.h: In instantiation of 'void ts::Dispatcher<L, E, F>::dispatch(const EventType&) [with L = A; E = E; void (L::* F)(const E&) = &A::fun; ts::Dispatcher<L, E, F>::EventType = E]':
..main.cpp:575:19:   required from here

我在这里错过了什么?

假设它编译并运行,那么它可能会警告Dispatcher::dispatch中有符号整数(i)和无符号整数(vector::size())之间的比较。vector::size()的返回类型是vector::size_type,一个无符号整型。

for (int i = 0; i < mListeners.size(); ++i) { ... }
            //  '-^------------------' signed < unsigned comparison

要消除编译器警告,将i声明为unsigned int:

for (unsigned int i = 0; i < mListeners.size(); ++i) { ... }