我有以下两个展示命令模式的类。 (不幸的是,两者都有唯一的方法名称。)
//pseudocode
class Subscriber {
virtual void receive(const Event&) = 0;
}
class Dispatcher {
virtual void dispatch(const Event&) = 0;
}
我有一个类模板,它有一个某种类型的列表,并有一个方法来迭代这个列表。
//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
}
}
我想使用 mem_fun
创建一个 Functor,它会根据需要调用 receive
或 dispatch
。我能够创建一个简单的用例,我只需调用一个没有任何参数的方法。即
//pseudocode
class Simple {
void simple() {/*...*/}
}
然后我重复:
for_each(_objects.begin(), _objects.end(), mem_fun(&Simple::simple);
不幸的是,我不知道如何将 event
参数传递给 mem_fun。查看 header ,似乎我可以传递单个参数,但我不太精通 C++,无法理解我需要做什么。
最终,我想让 iterate
方法接受一种仿函数,这样它就会在列表中的每个方法上触发该方法。
我宁愿避免使用 Boost...我认为这完全有可能,而无需将这个框架拖入混合中。
谢谢!
最佳答案
这可能是最直接的方式:
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;
};
然后:
for_each(_objects.begin(), _objects.end(), event_forwarder(event));
关于c++ - 将 Functor 作为参数传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5464496/