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

    [c++]passaggio Template

    ciao.
    Ho una classe template MyClass e 2 classi che la configurano pippo e pluto.
    Tutto il problema ruota attorno ad una funzione che crea MyClass e la configura con pippo o pluto.
    Nel mio applicativo ho due classi , una per la logica(è polimorfica , instanzia un puntatore m_pApi che è collocato nella seconda classe) .
    La logica esegue diverse operazioni , diverse per ogni categoria (tipi di importazione) e la seconda l'importatore vero e proprio che "si fa dare" i dati disaccoppiati(semplici strutture) dall api e crea gli oggetti veri e propri del mio importatore.

    Se eseguo un comando del tipo:
    codice:
    m_pApi->getTemplate<MyClass>(xxx);
    e la getTemplate è del tipo:
    codice:
    template< class T  >
    T GetTemplate(xxx)
    {
            if(/* logica della funzione semplificata con un if */)
                   return MyClass<Pippo>;
            else
                   return MyClass<Pluto>;
    
    }
    è chiaro che l'importatore non puo conoscere in anticipo se usero' pippo o pluto per configurare e ritornare il template MyClass.
    Quindi come posso recuperare il template cosi ' com è configurato dall'api?
    ho pensato di creare una variabile membro template con un getter, dopo chiamato GetTemplate setto questa variabile al valore MyClass<Pippo> o MyClass<Pluto> e la recupero , ma ancora non so definire i tipi.
    Un altra soluzione sarebbe avere nell' api un puntatore all' importatore e andare a settare sull' importatore il template , qui saprei i parametri ma non so come procedere e comunque la lascerei come ultima soluzione in quanto devo avere questo puntatore e non vorrei.
    Insomma sono poco pratico chiedo un aiuto.

    ps. Infine in teoria,come si passa come parametro in genere un template?
    grazie

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quindi come posso recuperare il template cosi ' com è configurato dall'api?
    Semplice: non puoi.
    Il C++ ammette solo un tipo definito a compile time come tipo di ritorno.
    MyClass<Pippo> e MyClass<Pluto> sono di fatto due tipi distinti che non hanno niente a che vedere l'uno con l'altro (a meno che MyClass non sia polimorfa, nel qual caso occorre vedere come sia possibile, e se è possibile, adattare l'interfaccia alle due classi derivate).
    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
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    mi chiedevo se fosse possibile incapsulare tutto in una classe e restituire la classe????
    so che è una sciocchezza ma come fanno ad esempio i function object ad incapsulare la funzione?
    e se volessi passare solo pippo o solo pluto sarebbe possibile?
    come?
    grazie.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da giuseppe500
    mi chiedevo se fosse possibile incapsulare tutto in una classe e restituire la classe????
    Dipende da che grado di compromesso sei disposto a scendere.
    Fosse per me deriverei le due classi da una intefaccia comune per poi fare un downcast sfruttando la RTTI del linguaggio o un cast controllato in base a un enumerato.
    In ambedue i casi non te la cavi senza un puntatore allocato dinamicamente.

    so che è una sciocchezza ma come fanno ad esempio i function object ad incapsulare la funzione?
    Il come non è semplice da spiegare, specie se parliamo di std::tr1::function. In ogni caso pure con loro il problema permane.

    e se volessi passare solo pippo o solo pluto sarebbe possibile?
    come?
    grazie.
    Si. Come? Indicando alla funzione che tipo dev'essere usato per istanziare MyClass.
    codice:
    template< class T  >
    MyClass<T> getTemplate(xxx)
    {
        return MyClass<T>;
    }
    
    
    m_pApi->getTemplate<Pippo>(xxx);
    
    m_pApi->getTemplate<Pluto>(xxx);
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie .

    Un ultima cosa :
    Ho una serie di classi che derivano tutte da CEntityDs.
    E possibile creare un oggetto contenitore di tipo (type),in un template del genere :
    codice:
    template<typename T>
    class CExportDs
    {
           typedef T type;
    
    }
    e farlo ritornare da una funzione?
    il tipo lo conosco in anticipo , è un tipo base CEntityDs astratto.
    forse posso passarlo come template se conosco il tipo base che è sempre lo stesso.

    Il motivo sarebbe che non voglio instanziarlo subito, voglio solamente passare da un altra parte CExportDs con il suo tipo polimorfico e instanziarlo quando voglio
    CExportDs::type* pds = new CExportDs::type*.

    grazie e scusate se sono ripetitivo , penso ci voglia un po a fare entrare i template in testa.
    ciao.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da giuseppe500
    grazie .

    Un ultima cosa :
    Ho una serie di classi che derivano tutte da CEntityDs.
    E possibile creare un oggetto contenitore di tipo (type),in un template del genere :
    codice:
    template<typename T>
    class CExportDs
    {
           typedef T type;
    
    }
    e farlo ritornare da una funzione?
    Si, ma lo devi esplicitare.
    codice:
    CExportDs<Pippo>::type* ptr = GetQualcosa<Pippo>();
    il tipo lo conosco in anticipo , è un tipo base CEntityDs astratto.
    Allora che ti interessa passarlo come parametro a un template? Usalo direttamente, no?
    codice:
    CEntityDs* pds = new CEntityDsImplementation;
    Non è lo stesso di:
    codice:
    CExportDs<CEntityDs>::type* pds = new CEntityDsImplementation;
    ?
    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie 1000 shodan.
    ho capito, non sono pero riuscito a trovare il metodo per ritornare un template tramite funzione , si puo? mi sembra che hai detto che si puo ritornare solo un template in stl , ho letto sui template template parameters in google ma non sono riuscito a risolvere.
    a casa ho C++ Templates - The Complete Guide che mi leggero queste vacanze interamente adesso , c'è la soluzione? è spiegata in questo libro ?
    se si la domanda finisce qui , altrimenti ti chiedo un altro aiuto sempre se è possibile farlo.
    grazie,

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Si ritorna come un normale parametro, tenendo sempre presente che la deduzione dei parametri avviene sugli argomenti della funzione, non sul tipo ritornato. Quindi non può essere una funzione void argument a meno che non sia esplicitato il tipo
    codice:
    template <typename T> 
    T Qualcosa(T t) { return t;}
    
    int prova = Qualcosa(10); // ok
    
    
    template <typename T> 
    T Qualcosa() { return 0;}
    
    int prova = Qualcosa<int>(); // ok
    
    int prova = Qualcosa(); // ko.
    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.

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.