介绍mem_fun的使用示例。
假定的场景
以下假定的场景:观察者模式。subject通知所有的observer有某个新的数据。
代码
#include <functional>
#include <algorithm>
#include <iostream>
#include <list>
class TheData {
public:
TheData(int x, int y) : _x(x), _y(y) {}
//private:
int _x;
int _y;
};
class Observer {
public:
void Update(const TheData &data) {
std::cout << "Observer::Update(), id=" << _id << ", x=" << data._x << ", y=" << data._y << std::endl;
}
explicit Observer(int id) : _id(id) {}
private:
int _id;
};
class Subject {
public:
void RegisterObserver(Observer *bar) {
m_observers.push_back(bar);
}
void Notify(const TheData &data) {
std::for_each(m_observers.begin(), m_observers.end(),
std::bind2nd(std::mem_fun1<void, Observer, const TheData&>(&Observer::Update), data));
}
private:
std::list<Observer*> m_observers;
};
int main( )
{
Observer* observer1 = new Observer(1);
Observer* observer2 = new Observer(2);
Observer* observer3 = new Observer(3);
Subject subject;
subject.RegisterObserver(observer1);
subject.RegisterObserver(observer2);
subject.RegisterObserver(observer3);
TheData data(10, 20);
subject.Notify(data);
data._x = 15;
data._y = 25;
subject.Notify(data);
delete observer1;
delete observer2;
delete observer3;
return 0;
}
运行结果
Observer::Update(), id=1, x=10, y=20
Observer::Update(), id=2, x=10, y=20
Observer::Update(), id=3, x=10, y=20
Observer::Update(), id=1, x=15, y=25
Observer::Update(), id=2, x=15, y=25
Observer::Update(), id=3, x=15, y=25
请按任意键继续. . .
说明
使用for_each总是比iterator要简洁一些,所以在能够用for_each的地方,就避免使用下面迭代器的方式:
void Notify2(const TheData &data) {
std::list<Observer*>::iterator i(m_observers.begin());
for (; i != m_observers.end(); ++i) {
(*i)->Update(data);
}
}