C++ 新手。我有一个遵循观察者模式的听众向量类。侦听器继承自定义不同方法的抽象类,例如 on_start、on_stop、on_such_event 等。这些方法没有相同的签名。
我想编写一个事件处理方法,并在适当的时候从它调用注册的侦听器,使用适当的方法并提供所需的参数。当然,我可以为每个侦听器循环调用适当的方法。但这不是 DRY,代码很难遵循。
是否可以有一个函数来包装我的上述调用?类似的东西
void notify_listeners(?);
哪里“?”代表我现在不知道的东西。 notify_listeners() 将使用适当的方法和参数调用每个注册的侦听器。我想像这样从我的事件处理方法中调用它:
if (some_event)
notify_listeners(on_start(some arguments)); // calls on_start for each listener
if (other_event)
notify_listeners(on_stop(some other arguments));
"on_start" 和 "on_stop" 作为由侦听器定义的公共方法位于标题中。谢谢。
答案 0 :(得分:0)
你可以用这种方式写一个函数:
template <typename ...Params, typename ...Args>
void notify_listeners(void (MyBase::*method)(Params...), const Args &... args)
{
for (MyBase *listener : all_listeners)
(listener->*method)(args...);
}
其中 MyBase
是所有侦听器都继承自的类,具有 on_...
方法。
然后这样称呼它:
foo.notify_liteners(&MyBase::on_start, 1, 2, 3);