He estado jugando con functors en C++. En particular, tengo un vector de pares que me gustaría ordenar por el primer elemento del par. Comencé a escribir un functor completamente especializado (es decir, algo así como "bool MyLessThan (MyPair & lhs, MyPair & rhs)"). Entonces, solo porque este tipo de cosas son interesantes, quería intentar escribir un genérico "Aplicar F a los primeros elementos de este par". Escribí el siguiente, pero a g ++ no le gusta. Me sale:g ++ rechaza mi functor simple con "esperado un tipo, tengo 'xyz'"
de error: Tipo/valor de desajuste en el argumento 2 en la lista de parámetros de plantilla para 'plantilla struct Pair1stFunc2' de error: se esperaba un tipo, tiene 'menos'
#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>());
}
¿Alguien puede arrojar alguna luz sobre ¿Qué estoy haciendo mal aquí? Sé que esto es un ejemplo ligeramente artificial, pero me gustaría saber qué está pasando, aunque solo sea para mejorar mi STL-fu.
Una vez que resuelva este problema, tendrá otro porque F es un tipo. Estás construyendo una nueva F usando lhs.first y rhs.first. Encontrará que std :: less no tiene un constructor de dos argumentos. Necesitas tener un * valor * de tipo F. –
Aquí hay algo para mejorar tu boost :: bind-fu: sort (p.begin(), p.end(), bind (menos(), bind (y MyPair: : primero, _1), bind (& MyPair :: first, _2))); ;) http://codepad.org/NouR5fko –