簡體   English   中英

boost :: function對象容器上的STL算法

[英]STL algorithms on containers of boost::function objects

我有以下使用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部分:

typedef boost::function<void(void)> NullaryFunc;
for_each(callbacks_.begin(),callbacks_.end(),boost::bind(&NullaryFunc::operator(),_1));

要在單個轉換調用中完成所有這些操作,我想您需要對自身調用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);
    }
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM