1

我有以下使用 for 循环的代码,我想使用转换,或者至少使用 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)();
}
4

2 回答 2

3

我设法弄清楚第2部分:

typedef boost::function<void(void)> NullaryFunc;
for_each(callbacks_.begin(),callbacks_.end(),boost::bind(&NullaryFunc::operator(),_1));
于 2010-01-04T18:33:32.507 回答
2

要在单个转换调用中完成所有这些,我认为您需要对其自身调用 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 中,您可以使用 lambda 而不是仿函数类:

transform(options.begin(), options.end(), back_inserter(callbacks_), 
    [this](const OptionsMap::value_type &v) {
        return boost::bind(&ClassOutput::write_option_, this, v);
    }
);
于 2010-01-04T18:59:17.663 回答