2009-11-19 8 views
2

J'ai la classe suivante:mem_fun et problème bind1st

class A { 
public: 
// ctr and etc ... 
A* clone(B* container); 
}; 

Maintenant, je me suis un vector<A*> availableObjs déjà peuplé. Je veux appeler clone sur chacun d'eux, donc et insérer des objets clonés dans un nouveau conteneur clonedObjs de type vector<A*>. J'essaie de suivre - mais il ne compile pas:

transform(availableObjs.begin(), availableObjs.end(), back_inserter(clonedObjs), 
    bind1st(mem_fun(&A::clone), container)); // container is of type B* 

Y a-t-il un moyen de s'en sortir? J'ai beaucoup classifié comme A - donc faire de chacun d'eux un foncteur est trop difficile.

+0

Êtes-vous sûr que vous voulez avoir des pointeurs dans votre réservoir? Vous ne devez pas appeler d'algorithme de modification sur cet algorithme (comme par exemple trier). Cependant, vous pouvez utiliser un vecteur de shared_ptr , puis vous prenez à nouveau en charge la sémantique des valeurs. – fmuecke

Répondre

12

Vous devez utiliser bind2nd au lieu de bind1st:

transform(availableObjs.begin(), availableObjs.end(), back_inserter(clonedObjs), 
    bind2nd(mem_fun(&A::clone), container)); // container is of type B* 

Le foncteur créé par mem_fun(&A::clone) un A* attend comme premier paramètre. C'est l'instance normalement implicitement spécifiée sur laquelle la méthode est appelée. Le premier paramètre "réel" de A::clone est le second paramètre de mem_fun(&A::clone) et doit donc être lié à bind2nd.

+0

Merci - cela a fonctionné :) – soumeng78

2

Si vous utilisez Boost.Bind il pourrait ressembler à ceci:

std::transform(
       availableObjs.begin(), availableObjs.end(), 
       back_inserter(clonedObjs), 
       boost::bind<A*>(boost::mem_fn(&A::clone), _1, container));