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