我正在尝试编写一个以通用方式执行事件(或其他)调度的类。模板参数是事件侦听器的类型,要作为参数传递的事件类型,以及要在侦听器(成员函数)上调用的函数。这是类定义:
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
我在这里缺少什么?
答案 0 :(得分:1)
假设它编译并运行,那么可能会警告i
中有符号整数(vector::size()
)和无符号整数(Dispatcher::dispatch
)之间的比较。 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) { ... }