我正在尝试实现一个允许侦听某些事件的类,当这些事件发出时,它们会收到通知。
所以我想使用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()
在编译时可以获得有关各种参数的数据类型的信息。我可以使用这些信息来实现,使用模板或其他任何东西。
如果这个问题有另一种模式?我怎么能这样做?
答案 0 :(得分:1)
您问题的常见设计模式称为Observer Design-Pattern。
您所谓的“仿函数”不是仿函数。 如果是这样,他们将实现一个operator()方法,并且可以像函数一样被调用(因此名称为functor)。你的不是。
例如,这是一个仿函数:(注意运算符())
class MyFunctor
{
public:
void operator()(){};
};