对boost :: function对象的容器的STL算法

时间:2010-01-04 18:21:53

标签: c++ stl boost-bind boost-function

我有以下使用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)();
}

2 个答案:

答案 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);
    }
);