通用分派器类
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) { ... }
相关文章:
- 如何将事件循环中的事件分派给订阅者?
- 将泛型子类上的检查条件分派到只知道基类的上下文中
- 带有静态分派的c++ lambda
- 通用分派器类
- 类包装器和分派器
- 如何使用SWIG为c++模板类创建分派包装器类
- 为什么在c++中调用虚函数意味着消息分派
- 带有模板参数的c++函数分派
- 在虚拟分派之后调用基成员(模拟类似虚拟析构函数的分派)
- 双重分派和模板类
- 协变返回类型和分派
- c++ for Equals()的双分派
- 在虚方法中调用虚方法时,是否应该发生虚分派
- 使用模板或宏对多个类型进行静态分派
- 不带虚表的c++动态分派
- 如何将虚拟调用从未模板化的父级干净地分派到模板化的子级
- 标记分派结构不能插入对象类型
- 具有双重分派的循环依赖
- 在不知道完整层次结构的情况下进行双重分派