天天看點

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