我有以下使用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));
}
稍后在代码中,我实际上想要调用这个nullary函数对象的集合。我也在这里使用for循环,看起来我应该能够以某种方式使用for_each。
for(CallbackList::iterator itr = callbacks_.begin(); itr != callbacks_.end(); ++itr)
{
(*itr)();
}
答案 0 :(得分:3)
我设法弄清楚第2部分:
typedef boost::function<void(void)> NullaryFunc;
for_each(callbacks_.begin(),callbacks_.end(),boost::bind(&NullaryFunc::operator(),_1));
答案 1 :(得分: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而不是functor类:
transform(options.begin(), options.end(), back_inserter(callbacks_),
[this](const OptionsMap::value_type &v) {
return boost::bind(&ClassOutput::write_option_, this, v);
}
);