PDA

Visualizza la versione completa : [c++]trasformazioni e functor


giuseppe500
06-12-2011, 13:41
ciao.
Ho creato una classe base CTrasform da cui ereditano ctrasform3d e ctrasform2d.
Ho un profilo (insieme di punti 3d , i punti 2d hanno coordinata z = 0)
Vorrei creare un function object virtuale nella classe CTrasform e implementarlo in ctrasform2d e ctrasform3d, in questo caso vorrei implementarle come function object in modo che per trasformare una poliline (un insieme di punti)
mi basti passare il ctrasform alla poliline che un vector stl , e fare una cosa del genere:

void Poliline::Trasform(Ctrasform* pTrans){
vector<3dpoint> poliline;
transform(poliline.begin(),poliline.end(),pTrans)
}

in questo modo se passo alla funzione un ctrasform2d avro una trasformazione bidimensionale e se passo una ctrasform3d avro una trasformazione tridimensionale.

, possibile fare cose di questo genere con i function object(funzione virtuale e due function object polimorfici)

quello che nonriesco a capire :
posso passare un istanza di function object che contiene il classico operatore() o devo passare sempre e solo un tipo?
grazie.

un esercizio per adesso , sto passando di nuovo tutto il libro per vedere se ho capito veramente e chiedo i dubbi basilari, ciao.

shodan
06-12-2011, 18:57
Si pu fare, ma non in maniera diretta.
Se non ricordo male il functor per std::transform() passato per copia quindi no polimorfismo. Tuttavia basta creare un adapter e la cosa si risolve.

A grandi linee:



struct CTransformBase {
virtual return_type operator()(const 3dpoint& val)=0;
};

class CTransformAdapter {
public:
CTransformAdapter(CTransformBase& ctbase) : ctb(ctbase) {}
return_type operator()(const 3dpoint& val) {
// se reference
return ctb(val);
// se pointer
return (*ctb)(val);
}
private:
CTransformBase& ctb;
};

struct CTransform2D : public CTransformBase {
return_type operator()(const 3dpoint& val) {
// quel che
}
};

struct CTransform3D : public CTransformBase {
return_type operator()(const 3dpoint& val) {
// quel che
}
};

void Poliline::Trasform(CTransformBase * pTrans){
vector<3dpoint> poliline;
CTransformAdapter cta(ptrans);
transform(poliline.begin(),poliline.end(),cta)
}

MacApp
07-12-2011, 02:30
Originariamente inviato da shodan
Tuttavia basta creare un adapter e la cosa si risolve.

mitico ;-)

Loading