2010-09-21 169 views
2

我想使用std :: for_each將一系列字符串添加到組合框。對象的類型爲Category,我需要在其上調用GetName。我如何用boost::bind實現這個目標?如何使用std :: for_each和boost :: bind在參數上調用成員函數?

const std::vector<Category> &categories = /**/; 
std::for_each(categories.begin(), categories.end(), boost::bind(&CComboBox::AddString, &comboBox, _1); 

當前代碼失敗,因爲它試圖呼叫CComboBox::AddString(category)。這顯然是錯誤的。如何使用當前語法調用CComboBox::AddString(category.GetName())

+0

是否存在使用'std :: foreach'而不是迭代的嚴格必要性? – baton 2010-09-21 12:19:51

+0

不是一個嚴格的必要條件,只是試圖學習提升。 – 2010-09-21 12:59:35

回答

8
std::for_each(categories.begin(), categories.end(), boost::bind(&CComboBox::AddString, &comboBox, boost::bind(&Category::GetName, _1))); 
4

您可以使用lambda表達式,無論是Boost.Lambda或C++ lambda表達式(如果你的編譯器支持他們):

// C++ lambda 
const std::vector<Category> &categories = /**/; 
std::for_each(categories.begin(), categories.end(), 
       [&comboBox](const Category &c) {comboBox.AddString(c.GetName());}); 
+0

感謝您的建議,儘管VS2008不支持lambdas(我想我應該在標籤中指定)。 – 2010-09-21 12:58:06

+0

VS2008支持Boost.Lambda。 – 2010-09-21 13:14:25

+0

無論如何,我刪除了Boost.Lambda示例,因爲它不正確,並且正確的看起來更像接受的答案。 – 2010-09-21 13:35:38

0

一個可能的方式實現這一目標將使用mem_funbind1st

3

我知道你問過關於使用std :: for_each,但在這些情況下,我喜歡使用BOOST_FOREACH,它使代碼更具可讀性(在我看來)並且更易於調試:

const std::vector<Category> &categories = /**/; 
BOOST_FOREACH(const Category& category, categories) 
    comboBox.AddString(category.GetName()); 
+0

從我+1。 BOOST_FOREACH是一個非常酷的壯舉。發明人Eric Niebler寫了一篇描述它的文章:http://www.artima.com/cppsource/foreach.html。次要的挑剔,如果你使用大括號,就會更清楚BOOST_FOREACH是多麼令人難以置信的酷炫。 – 2010-09-22 06:58:26

相關問題