将Functor作为方法传递给方法

Tim*_*ddy 3 c++ templates functor

我有以下两个展示Command模式的类.(不幸的是,两者都有一个独特的方法名称.)

//pseudocode 
class Subscriber {
    virtual void receive(const Event&) = 0;
}

class Dispatcher {
    virtual void dispatch(const Event&) = 0;
}
Run Code Online (Sandbox Code Playgroud)

我有一个类模板,其中包含一些类型的列表,其中包含迭代此列表的方法.

//pseudocode
template<typename T>
class Registry {
    typedef list<T> ObjectList;
    ObjectList _objects;
    void iterate(const Event& event) {
        for_each(_objects.begin(), _objects.end(), ...);  //not sure what to do here
    }
}
Run Code Online (Sandbox Code Playgroud)

我想mem_fun用来创建一个调用receivedispatch适当的Functor .我能够创建一个简单的用例,我只需调用一个没有任何参数的方法.即

//pseudocode
class Simple {
    void simple() {/*...*/}
}
Run Code Online (Sandbox Code Playgroud)

然后我迭代:

for_each(_objects.begin(), _objects.end(), mem_fun(&Simple::simple);
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道如何将eventparam传递给mem_fun.看看标题,看起来我确实可以传递一个参数,但我并不精通C++来理解我需要做什么.

最后,我想让iterate方法接受一种类型的仿函数,因此它会在列表中的每个方法上触发该方法.

我宁愿避免Boost ...我认为这完全有可能不将这个框架拖入混合中.

谢谢!

GMa*_*ckG 6

这可能是最直接的方式:

class event_forwarder // make private in Registry
{
public:
    event_forwarder(const Event& event) :
    mEvent(event)
    {}

    void operator()(Subscriber& subcriber) const
    {
        subscriber.receive(mEvent);
    }

    void operator()(Dispatcher& dispatcher) const
    {
        dispatcher.dispatch(mEvent);
    }

private:
    const Event& mEvent;
};
Run Code Online (Sandbox Code Playgroud)

然后:

for_each(_objects.begin(), _objects.end(), event_forwarder(event));
Run Code Online (Sandbox Code Playgroud)