STL алгоритмы на контейнерах объектов boost :: function - PullRequest
1 голос
/ 04 января 2010

У меня есть следующий код, который использует цикл for, и я хотел бы использовать вместо него transform или, по крайней мере, for_each, но я не понимаю, как.

typedef std::list<boost::function<void(void) > CallbackList;
CallbackList callbacks_;

//...
for(OptionsMap::const_iterator itr = options.begin(); itr != options.end(); ++itr)
{
   callbacks_.push_back(boost::bind(&ClassOutput::write_option_,this,*itr));
}

Позже в коде я на самом деле хочу вызвать эту коллекцию объектов нулевых функций. Я также использую цикл for, и кажется, что я должен каким-то образом использовать for_each.

for(CallbackList::iterator itr = callbacks_.begin(); itr != callbacks_.end(); ++itr)
{    
  (*itr)();
}

Ответы [ 2 ]

3 голосов
/ 04 января 2010

Мне удалось выяснить часть 2:

typedef boost::function<void(void)> NullaryFunc;
for_each(callbacks_.begin(),callbacks_.end(),boost::bind(&NullaryFunc::operator(),_1));
2 голосов
/ 04 января 2010

Чтобы сделать все это за один вызов преобразования, я думаю, что вам нужно вызвать bind для себя, потому что вам нужен функтор, который вызывает boost: bind. Это то, что я никогда не пытался. Вы бы согласились на что-то вроде этого (не проверено)?

struct GetFunc {
    ClassOutput *obj;
    boost::function<void(void) > operator()(const OptionsMap::value_type &v) {
        return boost::bind(&ClassOutput::write_option_, obj, v);
    }
    GetFunc(ClassOutput *obj) : obj(obj) {}
};

transform(options.begin(), options.end(), back_inserter(callbacks_), GetFunc(this));

В C ++ 0x вы можете использовать лямбду вместо класса функтора:

transform(options.begin(), options.end(), back_inserter(callbacks_), 
    [this](const OptionsMap::value_type &v) {
        return boost::bind(&ClassOutput::write_option_, this, v);
    }
);
...