Как вызвать функцию-член для параметра с помощью std :: for_each и boost :: bind? - PullRequest
2 голосов
/ 21 сентября 2010

Я хочу добавить ряд строк в поле со списком, используя 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 ]

8 голосов
/ 21 сентября 2010
std::for_each(categories.begin(), categories.end(), boost::bind(&CComboBox::AddString, &comboBox, boost::bind(&Category::GetName, _1)));
4 голосов
/ 21 сентября 2010

Вы можете использовать лямбды, Boost.Lambda или C ++ лямбды (если ваш компилятор их поддерживает):

// C++ lambda
const std::vector<Category> &categories = /**/;
std::for_each(categories.begin(), categories.end(),
              [&comboBox](const Category &c) {comboBox.AddString(c.GetName());});
3 голосов
/ 21 сентября 2010

Я знаю, что вы спрашивали об использовании std :: for_each, но в этих случаях мне нравится использовать BOOST_FOREACH, это делает код более читабельным (по моему мнению) и более простым для отладки:

const std::vector<Category> &categories = /**/;
BOOST_FOREACH(const Category& category, categories)
    comboBox.AddString(category.GetName());
0 голосов
/ 21 сентября 2010

Возможный способ достичь этого - использовать mem_fun и bind1st

...