2011-10-02 136 views
2

雖然試圖熟悉boost,但偶然發現使用boost::function以及std::vector的問題。我試圖做一件簡單的事情:有一個與similair簽名功能列表,然後在樣本數據上使用std::for_each的所有功能。下面是代碼:使用std :: vector <boost :: function> with boost :: bind

typedef boost::function<int (const char*)> text_processor; 
typedef std::vector<text_processor> text_processors; 
text_processors processors; 
processors.push_back(std::atoi); 
processors.push_back(std::strlen); 

const char data[] = "123"; 

std::for_each(processors.begin(), processors.end(), 
    std::cout << boost::bind(&text_processors::value_type::operator(), _1, data) 
       << "\n" 
); 

所以,用for_each我試着寫到標準輸出將每一個功能採樣數據的結果。但它不會像這樣編譯(有關關於bind結果缺少運算符<<的一些長消息)。

如果我刪除流操作符然後我會編譯,但無用的代碼。訣竅是我想在單個for_each中進行函數應用和文本輸出。我錯過了什麼?認爲這應該是容易的lambda或像這樣,但不能找出正確的解決方案。

回答

4

與您的代碼的問題是,你正試圖在不允許一種方式來創建到位算符(在for_each第三個參數,你不能隨便扔代碼,你需要傳遞函子)。

沒有拉姆達支持的編譯器,你可以使用std::transform而非std::for_each(未測試......但這應該工作):

std::transform(processors.begin(), processors.end(), 
       std::ostream_iterator<int>(std::cout, "\n"), 
       bind(&text_processors::value_type::operator(), _1, data)); 

如果你的編譯器支持lambda表達式,你可以用它做:

const char data[] = "123"; 
std::for_each(processors.begin(), processors.end(), 
    [&data](text_processors const &) { 
     std::cout << boost::bind(&text_processors::value_type::operator(), _1, data) 
       << "\n" 
    } 
); 

但你可以避開bind乾脆:

std::for_each(processors.begin(), processors.end(), 
       [&data](text_processors::value_type & op) { 
        std::cout << op(data) << "\n"; 
       } 
); 
+0

感謝您的回覆。使用'std :: transform'的解決方案似乎可以解決這個問題。我試圖把我的頭包裹在一些事實上:'std :: cout << boost :: lambda :: _ 1 <<「\ n」'是一個函子,'boost :: bind(...)'是一個函子。但我仍然沒有辦法將它們合併到一個函子中,將它們傳遞給'std :: for_each'。 – elricbk

+0

我沒有使用boost lambda庫,並且它已經很長時間了,因爲我閱讀了文檔,但是IIRC有一個'boost :: lambda :: bind',它可能在您需要的行中。再次,沒有真正的經驗,你的里程可能會有所不同 –

相關問題