2009-03-12 7 views
8

J'ai un conteneur de pointeurs que je veux parcourir, en appelant une fonction membre qui a un paramètre qui est une référence. Comment est-ce que je fais ceci avec STL?std :: for_each, fonction de membre appelant avec le paramètre de référence

Ma solution actuelle consiste à utiliser boost :: bind et boost :: ref pour le paramètre.

// Given: 
// void Renderable::render(Graphics& g) 
// 
// There is a reference, g, in scope with the call to std::for_each 
// 
std::for_each(
    sprites.begin(), 
    sprites.end(), 
    boost::bind(&Renderable::render, boost::ref(g), _1) 
); 

Une question connexe (dont je tirais ma solution actuelle de) est boost::bind with functions that have parameters that are references. Cela demande spécifiquement comment le faire avec boost. Je demande comment cela serait fait sans boost.

Modifier: Il existe un moyen de faire la même chose sans utiliser boost. En utilisant std::bind et les amis du même code peut être écrit et compilé dans un compilateur C++ 11 compatible comme ceci:

std::for_each(
    sprites.begin(), 
    sprites.end(), 
    std::bind(&Renderable::render, std::placeholders::_1, std::ref(g)) 
); 
+0

boost :: bind (et Renderable :: render, _1, boost :: ref (g)) devrait probablement être boost :: bind (& Renderable :: render, boost :: ref (g), _1) – Carl

+0

@carleeto Bon capture. Corrigé après 4 ans d'erreur! –

Répondre

5

Ceci est un problème avec la conception de <functional>. Vous devez utiliser boost :: bind ou tr1 :: bind.

+0

oui, malheureusement :(plus d'informations à ce sujet: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2000/n1245.ps et http://www.open-std.org /jtc1/sc22/wg21/docs/cwg_defects.html#106 qui apparemment n'a jamais été dans la norme, mais c'est dans la suivante :) –

+0

Oui, les problèmes de références aux références étaient exactement mon problème. Merci pour l'info! –

Questions connexes