Вызовите функцию-член c ++ с каждым элементом в списке? - PullRequest
1 голос
/ 14 сентября 2010

У меня есть список Thing и Controller, которые я хочу notify() с каждой из вещей. Код ниже работает:

#include <algorithm>
#include <iostream>
#include <tr1/functional>
#include <list>
using namespace std;

class Thing { public: int x; };

class Controller
{
public:
    void notify(Thing& t) { cerr << t.x << endl; }
};

class Notifier
{
public:
    Notifier(Controller* c) { _c = c; }
    void operator()(Thing& t) { _c->notify(t); }
private:
    Controller* _c;
};

int main()
{
    list<Thing> things;
    Controller c;

    // ... add some things ...
    Thing t;
    t.x = 1; things.push_back(t);
    t.x = 2; things.push_back(t);
    t.x = 3; things.push_back(t);

    // This doesn't work:
    //for_each(things.begin(), things.end(),
    //         tr1::mem_fn(&Controller::notify));

    for_each(things.begin(), things.end(), Notifier(&c));
    return 0;
}

Мой вопрос: могу ли я избавиться от класса Notifier с помощью какой-либо версии строки "Это не работает"? Кажется, я должен быть в состоянии заставить что-то работать, но не могу получить правильную комбинацию. (Я возился с различными комбинациями.)

Без использования наддува? (Я бы, если бы мог.) Я использую g ++ 4.1.2, да, я знаю, что он старый ...

Ответы [ 2 ]

4 голосов
/ 14 сентября 2010

Вы можете сделать это, используя bind, который изначально был от Boost, но включен в TR1 и C ++ 0x:

using std::tr1::placeholders::_1;
std::for_each(things.begin(), things.end(),
              std::tr1::bind(&Controller::notify, c, _1));
3 голосов
/ 14 сентября 2010

Как насчет того, чтобы пойти в старшую школу:

for(list<Thing>::iterator i = things.begin(); i != things.end(); i++)
  c.notify(*i);
...