Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]trasformazioni e functor

    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.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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)
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Originariamente inviato da shodan
    Tuttavia basta creare un adapter e la cosa si risolve.
    mitico ;-)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.