使用列表中的每个元素调用c ++成员函数?

时间:2010-09-14 00:09:50

标签: c++ stl tr1

我有一个ThingController的列表,我希望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 个答案:

答案 0 :(得分:4)

您可以使用bind完成此操作,using std::tr1::placeholders::_1; std::for_each(things.begin(), things.end(), std::tr1::bind(&Controller::notify, c, _1)); 最初来自Boost但包含在TR1和C ++ 0x中:

{{1}}

答案 1 :(得分:3)

去老学怎么样:

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