c++ - 通用调度程序类

标签 c++ templates events generics

我正在尝试编写一个以通用方式进行事件(或其他)调度的类。模板参数是事件监听器的类型、作为参数传递的事件类型以及要在监听器上调用的函数(成员函数)。这是类定义:

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;

};

dispatch方法的定义:

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

我在这里错过了什么?

最佳答案

假设它编译并运行,那么它可能会警告有符号整数 (i) 和无符号整数 (vector::size()) 之间的比较Dispatcher::dispatchvector::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) { ... }

关于c++ - 通用调度程序类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17155488/

相关文章:

c++ - 在 std::floor 之后转换为 int 可以保证正确的结果吗?

c++ - 我可以通过 AF_INET 域套接字连接到 ipv6 地址吗?

java - 需要更好的模板语言

c++ - 如何连续读取标准输入?

c++ - 在类中使用 "class[i]"访问 vector ,例如类将是 vector

c++ - 在模板结构的所有实例中将成员设置为相同的值

C++ 函数模板按值特化 (-1)

java - 将事件/回调绑定(bind)到 Java 中的关键字

c# - 无法删除强制转换事件处理程序

events - 在事件驱动架构中,命令是否应该以与事件相同的方式发布到主题?