我想使用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())
?
答案 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_fun
和bind1st