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:
codice: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) }