天天看点

mem_fun假定的场景代码运行结果说明

介绍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);
    }
}