Ho giocato con i funtori in C++. In particolare, ho un vettore di coppie che vorrei ordinare per il primo elemento della coppia. Ho iniziato a scrivere un funtore completamente specializzato (ad esempio "bool MyLessThan (MyPair & lhs, MyPair & rhs"). Quindi, solo perché questo tipo di cose è interessante, ho voluto provare a scrivere un functor generico "Applica F ai primi elementi di questa coppia". Ho scritto il seguito, ma a g ++ non piace. Ottengo:g ++ rifiuta il mio semplice functor con "atteso un tipo, ottenuto 'xyz'"
errore: Tipo/valore non corrispondente al argomento 2 nella lista dei parametri modello per 'template struct Pair1stFunc2' errore: atteso un tipo, ha 'meno'
#include <algorithm>
#include <functional>
#include <utility>
#include <vector>
template <class P, class F>
struct Pair1stFunc2
{
typename F::result_type operator()(P &lhs, P &rhs) const
{ return F(lhs.first, rhs.first); }
typename F::result_type operator()(const P &lhs, const P &rhs) const
{ return F(lhs.first, rhs.first); }
};
typedef std::pair<int,int> MyPair;
typedef std::vector<MyPair> MyPairList;
MyPairList pairs;
void foo(void)
{
std::sort(pairs.begin(),
pairs.end(),
Pair1stFunc2<MyPair, std::less>());
}
Qualcuno può far luce su cosa sto facendo di sbagliato qui? So che questo è un esempio un po 'artificiale, ma mi piacerebbe sapere cosa sta succedendo, se non altro per migliorare il mio STL-fu.
Una volta risolto questo problema, ne avrai un altro perché F è un tipo. Stai costruendo un nuovo F usando lhs.first e rhs.first. Troverai che std :: less non ha un costruttore a due argomenti. Devi avere un * valore * di tipo F. –
Ecco qualcosa per migliorare il tuo boost :: bind-fu: sort (p.begin(), p.end(), bind (meno(), bind (& MyPair: : first, _1), bind (& MyPair :: first, _2))); ;) http://codepad.org/NouR5fko –