Question

Je suis en train de se pencher boost :: bind, boost :: lambda bibliothèques et comment ils peuvent être utilisés avec des algorithmes de STL. Supposons que j'ai vecteur de paires chaîne int qui est triée par clé int. Ensuite, un endroit pour insérer une nouvelle paire tout en maintenant se trouve le vecteur trié comme suit:

std::vector<std::pair<int, string> > entries;
...
int k = ...;

// Let's ignore std::lower_bound return value for now
std::lower_bound (entries.begin(), entries.end(), k, 
                  boost::bind (&std::pair<int, string>::first, _1) < k)

Maintenant, je voudrais remplacer operator< avec un objet de fonction (de type std::less<int> dans cet exemple):

std::less<int> comparator;

Comment puis-je modifier le code ci-dessus il fonctionne? Je ne peux pas faire

std::lower_bound (entries.begin(), entries.end(), k, 
                  comparator (boost::bind (&std::pair<int, string>::first, _1), k))

parce que std::less<int>::operator() n'accepte pas quel que soit le type de retour de boost::bind. Qu'est-ce que j'oublie ici? TIA

Était-ce utile?

La solution

Tout ce que vous êtes absent est un autre bind (et les paramètres du modèle sur pair):

std::lower_bound(entries.begin(), entries.end(), k, 
                 boost::bind(comparator,
                             boost::bind(&std::pair<int, string>::first, _1),
                             k))

Vous ne devez pas faire le moins que l'opérateur dans votre code d'origine, car Boost.Bind fournit pour cet opérateur surcharge qui savent comment gérer le type de retour de boost::bind.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top