观察者模式的 C++ 包装器

时间:2021-03-16 18:29:36

标签: c++ function parameters

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" 作为由侦听器定义的公共方法位于标题中。谢谢。

1 个答案:

答案 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);
相关问题