2010-09-21 5 views
2

Je veux ajouter une série de chaînes à une zone de liste déroulante en utilisant std :: for_each. Les objets sont de type Category et je dois appeler le GetName. Comment puis-je y parvenir avec boost::bind?Comment appeler une fonction membre sur un paramètre avec std :: for_each et boost :: bind?

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

Le code actuel échoue, il essaie d'appeler CComboBox::AddString(category). Ce qui est évidemment faux. Comment puis-je appeler CComboBox::AddString(category.GetName()) en utilisant la syntaxe actuelle?

+0

Existe-t-il une stricte nécessité d'utiliser 'std :: foreach' au lieu d'itérer? – baton

+0

Pas une nécessité stricte, juste essayer d'apprendre boost. –

Répondre

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

Vous pouvez utiliser lambdas, soit Boost.Lambda ou C++ lambdas (si votre compilateur les prend en charge):

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

Merci pour ces suggestions, VS2008 ne supporte pas lambdas (j'imagine que j'aurais dû le spécifier dans les tags). –

+0

VS2008 prend en charge Boost.Lambda. –

+0

Quoi qu'il en soit, j'ai supprimé l'exemple Boost.Lambda car il était incorrect et un exemple correct ressemblerait plus à la réponse acceptée. –

0

Une façon d'y parvenir serait d'utiliser mem_fun et bind1st

3

Je sais Vous avez demandé à propos de l'utilisation de std :: for_each, mais dans ces cas j'aime utiliser BOOST_FOREACH à la place, cela rend le code plus lisible (à mon avis) et plus facile à déboguer:

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

+1 de moi. BOOST_FOREACH est un exploit incroyablement cool. L'inventeur Eric Niebler a écrit un article le décrivant: http://www.artima.com/cppsource/foreach.html. Nitrick mineur, si vous utilisez des accolades, il devient plus clair à quel point BOOST_FOREACH est incroyablement cool. –

Questions connexes