2010-11-15 4 views
15

S'il vous plaît jeter un oeil à cet exemple publié par Johannes Schaub pour trier un vecteur de paires:Aidez-moi à comprendre l'utilisation de boost :: bind

How do I sort a vector of pairs based on the second element of the pair?

std::sort(a.begin(), a.end(), 
      boost::bind(&std::pair<int, int>::second, _1) < 
      boost::bind(&std::pair<int, int>::second, _2)); 

Je pensais que je ne comprends boost: : bind, mais j'ai des problèmes avec celui-ci.

Question 1:

l'algorithme de tri attend une fonction sous-jacente en un troisième paramètre. Ce que je vois ici, c'est une expression booléenne. Qu'est-ce que je manque ?:

boost::bind(&std::pair<int, int>::second, _1) < boost::bind(&std::pair<int, int>::second, _2) 

Est-ce que le coup de pouce :: bind opérateur de surcharge bibliothèque < pour ces deux se fixe, et retourne une sorte de pointeur de fonction (comme un lambda)?

Question 2:
Cela me devient confus:

boost::bind(&std::pair<int, int>::second, _1) 

Habituellement, il y a une sorte de pointeur de fonction en tant que premier paramètre d'un appel de liaison, mais ici, il est une adresse d'un membre de la classe? Quel est le résultat de cette liaison particulière?

Merci pour votre temps & aide

Répondre

14

boost :: bind surchargent l'opérateur! et les opérateurs relationnels et logiques ==,! =, <, < =,>,> =, & &, alors c'est pourquoi vous "voyez" une expression booléenne, mais vous récupérez vraiment un prédicat de fonction . À partir de là, vous pouvez voir que vous liez le second membre de la paire pour les 1er et 2ème arguments de la fonction surchargée surchargée.

Quant à votre deuxième question: bind Boost reconnaîtra lorsque vous avez passé un pointeur sur un membre et le traiter comme si vous avez appelé

bind<R>(mem_fun(&std::pair<int,int>::second), args); 

Voici comment la documentation décrit ceci:

en utilisant bind avec des pointeurs aux membres

pointeurs aux fonctions membres et des pointeurs vers des membres de données ne sont pas objets fonction, car ils ne prennent pas en charge opérateur (). Pour plus de commodité, bind accepte les pointeurs de membre comme premier argument et le comportement est si boost :: mem_fn a été utilisé pour convertir le pointeur de membre en objet de fonction .En d'autres termes, l'expression

bind (& X :: f, args)

est équivalente à

bind (mem_fn (& X :: f), args)

où R est le type de retour de X :: f (pour les fonctions membres) ou le type de l'élément (pour les membres de données.)

Vous pouvez trouver ceci et plus d'informations here.

Questions connexes