如何使用std :: for_each和boost :: bind调用参数的成员函数?

时间:2010-09-21 12:06:39

标签: c++ visual-studio-2008 boost stl boost-bind

我想使用std :: for_each将一系列字符串添加到组合框中。对象属于Category类型,我需要在它们上面调用GetName。如何使用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())

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

您可以使用lambdas,Boost.Lambda或C ++ lambdas(如果您的编译器支持它们):

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

答案 2 :(得分:3)

我知道你问过使用std :: for_each,但是在那些情况下我喜欢使用BOOST_FOREACH,它使代码更具可读性(在我看来)并且更容易调试:

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

答案 3 :(得分:0)

实现此目标的一种可能方法是使用mem_funbind1st