代码之家  ›  专栏  ›  技术社区  ›  bstpierre Edgar Aviles

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

  •  1
  • bstpierre Edgar Aviles  · 技术社区  · 14 年前

    我有一张清单 Thing 和A 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 通过使用“这不起作用”行的某个版本来初始化?似乎我应该能做点什么,但不能很好地得到正确的组合。(我摸索了许多不同的组合。)

    不使用Boost?(如果可以的话我会的。)我正在使用G++4.1.2,是的,我知道它很旧…

    2 回复  |  直到 14 年前
        1
  •  4
  •   James McNellis    14 年前

    你可以用 bind ,它最初来自Boost,但包含在Tr1和C++0x:

    using std::tr1::placeholders::_1;
    std::for_each(things.begin(), things.end(),
                  std::tr1::bind(&Controller::notify, c, _1));
    
        2
  •  3
  •   sje397    14 年前

    上老校怎么样?

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