2010-04-26 5 views
4

Je suis nouveau en C++ et j'essaie d'utiliser la fonction std :: sort pour trier un vecteur de Solutions.Méthodes virtuelles en tant que fonction Comp pour trier

Le code est quelque chose comme ceci (liste des solutions est un vecteur *):

void SolutionSet::sort(Comparator &comparator) { 

std::sort(solutionsList_->begin(), solutionsList_->end(), &comparator::compare); 

} 

Le comparateur param est une instance de classe des enfants Comparator's, et la méthode comparer est virtuelle à la classe Comparator et mis en œuvre par toutes les classes enfants de Comparator.

Et je veux utiliser cette fonction comme une fonction de comparaison à std: sort().

Est-ce possible?

Si c'est le cas, quelqu'un peut-il me dire comment? Parce qu'avec le code précédent, cela ne fonctionne pas.

Si je n'ai pas été clair, s'il vous plaît demandez!

Merci les gars!

+0

Quel est le type à l'intérieur solutionsList? –

Répondre

1

Vous devriez utiliser std :: bind comme Comparator :: compare est une méthode d'instance, donc il a besoin d'un objet Comparator comme paramètre.

Quelque chose comme ça:

std::sort (...., std::bind (&Comparator::compare, comparator)); 
+1

'std :: bind' est en C++ 0x seulement. –

5

STL foncteurs doivent être monomorphe car STL foncteurs sont passés en valeur.

Si vous avez besoin comportement polymorphique, vous devez envelopper cette fonctionnalité dans une classe monomorphe:

à savoir

struct MonomorphicWrapper : std::binary_function<Solution, Solution, bool> 
{ 
    bool operator()(const Solution& lhs, const Solution& rhs) 
    { 
     return lhs.compare(rhs); 
    } 
}; 
+0

Comme vous pouvez le voir dans mon post précédent, c'est le Super Class Comparator qui compare les deux solutions. Donc ce n'est pas la meilleure solution pour moi. Mais je pensais à quelque chose comme ceci: Je pourrais faire une structure avec des pointeurs de remorquage à deux solutions différentes, et l'utiliser comme premier paramètre de l'enveloppe, et l'instance de comparateur comme deuxième paramètre. Cela fonctionnerait-il? – user326092

+0

@ wilsongoncalo.mp: Oui, vous pouvez utiliser le modèle de stratégie toute la journée. –

Questions connexes