PDA

Visualizza la versione completa : [c++ stl]passare un parametro al comparer


giuseppe500
03-08-2010, 12:40
CIao.
Sto cercando di ordinare un vector in modi diversi , per questo uso la funzione stl sort e passo il comparer:


inline int cmpCompare ( CEntity* pEnt1, CEntity* pEnt2)
{
double xEnt1 = (*pEnt1).GetCoord(0);
double yEnt1 = (*pEnt1).GetCoord(1);
double zEnt1 = (*pEnt1).GetCoord(2);

double xEnt2 = (*pEnt2).GetCoord(0);
double yEnt2 = (*pEnt2).GetCoord(1);
double zEnt2 = (*pEnt2).GetCoord(2);

if( xEnt1 == xEnt2 && yEnt1 == yEnt2 && zEnt1 < zEnt2)
return 1;

if( xEnt1 == xEnt2 && yEnt1 < yEnt2)
return 1;

if( xEnt1 < xEnt2 )
return 1;

return 0;
}


a seconda del tipo di CEntity che puo' essere A,B o C devo per A e B fare il cast del centity
ad A o B e richiamare la funzione A->getCentroid o B-GetCentroid che ritorna un double, altrimenti se C devo chiamare una altra funzione , GetCoord().

pensavo di passare un parametro al comparer con il tipo secondo cui devo caricare questi dati:l'indice la componenete del punto 3d(x,y o z)
double xEnt1 = (*pEnt1).GetCoord(0);
double yEnt1 = (*pEnt1).GetCoord(1);
double zEnt1 = (*pEnt1).GetCoord(2);

double xEnt2 = (*pEnt2).GetCoord(0);
double yEnt2 = (*pEnt2).GetCoord(1);
double zEnt2 = (*pEnt2).GetCoord(2);

chiamando 3 funzioni diverse di caricamento dati :
se A:
double xEnt1 = (*A).GetCentroid(0);
double yEnt1 = (*A).GetCentroid(1);
.
.
.
se B:
double xEnt1 = (*B).GetCentroid(0);
double yEnt1 = (*B).GetCentroid(1);
.
.
.
se C:
double xEnt1 = C.GetCoord(0);
double yEnt1 = C.GetCoord(1);
.
.
.
ecc...
pensavo se non si puo' passare un parametro al comparer di templatizzare la classe e specializzarla per i 3 casi , voi come fareste?
grazie.

shodan
03-08-2010, 12:56
Crea un functor e passa i parametri che ti interessano tramite il costruttore.

giuseppe500
03-08-2010, 13:08
capito , ma dopo dato che uso la funzione stl sort , posso ridefinire magari l'operatore < ? possibile?
e le funzioni bind2nd e bind1nd a cosa servono?
grazie.

Loading