2010-11-15 16 views
15

Si prega di dare un'occhiata a questo esempio pubblicato da Johannes Schaub per ordinare un vettore di coppie:Aiutami a capire questo utilizzo di boost :: legare

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)); 

Pensavo capisco spinta: : legare, ma ho problemi con questo.

Domanda 1:

algoritmo del genere si aspetta una funzione predicato come un terzo parametro. Quello che vedo qui è un'espressione booleana. Che cosa mi manca ?:

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

Condivide la spinta :: bind biblioteca operatore di sovraccarico < per quei due si lega, e sta tornando una sorta di puntatore a funzione (come un lambda)?

Domanda 2:
Questo mi fa confusa:

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

Di solito c'è una sorta di puntatore a funzione come primo parametro di una chiamata bind, ma qui si tratta di un indirizzo di un membro della classe? Qual è il risultato di quel particolare legame?

Grazie per il vostro tempo & aiuto

risposta

14

boost :: bind sovraccarica l'operatore! e gli operatori logici e relazionali ==,! =, <, < =,>,> =, & &, ||, quindi questo è il motivo per cui "vedi" un'espressione booleana, ma stai davvero recuperando un predicato di funzione .

Da lì è possibile vedere che si sta vincolando il secondo membro della coppia per il 1 ° e il 2 ° argomento della funzione meno che sovraccaricata.

Per quanto riguarda la seconda domanda: Boost legano riconoscerà quando si sono passati un puntatore a un membro e trattarlo come se si chiama

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

Questo è come la documentazione descrive questo:

Utilizzando legano con i puntatori ai membri

puntatori a funzioni membro e puntatori a membri dati non sono oggetti funzione, perché non supportano l'operatore di supporto (). Per comodità, il collegamento accetta i puntatori membri come primo argomento e il comportamento è come se boost :: mem_fn è stato utilizzato per convertire il puntatore membro in un oggetto funzione .In altre parole, il binding espressione

(& X :: f, args)

equivale a

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

dove R è il tipo di ritorno di X :: f (per funzioni membro) o il tipo di l'organo (per membri di dati.)

Potete trovare questo e ulteriori informazioni here.

Problemi correlati