Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [c++]Templates

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

    [c++]Templates

    Ciao.
    Ho tre variabili di tipo diverso , ma che ereditano da una comune classe base.
    Le tre classi non sono state create da ma vorrei implementare 3 comportamenti diversi per i 3 tipi.
    Per intenderci :scorro un xml in cui il nodo puo' essere di tre tipi diversi e "porta" in se i dati che devo leggere , vorrei creare qualcosa del tipo:

    codice:
    //leggo il nodo
    Type = xmlReadNodeandNext()
    //Type puo ' essere di 3 tipi diversi
    import<???>(Type)???
    // a seconda del tipo carica i dati corrispondenti
    //richiamando la funzione relativa:
    si puo' risolvere coi template?

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Spiega meglio il problema che così è poco chiaro..

    Potrebbe essere utile creare una classe template che si aspetta un tipo della classe base ma che cambia il suo comportamento in base al tipo derivato..

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Premesso che si può fare tranquillamente anche senza, occorre un cast ( un dynamic_cast ) per la precisione. Meglio se definisci un pò meglio quel che ti serve.

    Con i template la cosa più semplice è fornire la specializzazione del template stesso, lasciando al compilatore la scelta della funzione specializzata più adatta (che ovviamente andrà implementata).
    Es.
    codice:
    // generico
    template <typename T> void insert<T>(Nodo* n);
    
    // specializzato per Element
    template <> void insert<Element>(Nodo* n) {
       Element* el = dynamic_cast<Element*>(n);
       if (el) {
           // operazioni varie proprie di Element.
       }
    } 
    
    // specializzato per Attribute
    template <> void insert<Attribute>(Nodo* n) {
       Attribute* attr = dynamic_cast<Attribute*>(n);
       if (attr) {
           // operazioni varie proprie di Element.
       }
    } 
    
    ...
    insert<Element>(node);
    insert<Attribute>(node);

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    insert<Element>(node);
    insert<Attribute>(node);
    scusate , cerco di esporre meglio:

    vorrei che runtime il template si comportasse diversamente(invocasse una funzione diversa) a seconda del tipo del nodo un po come si fa normalmente con l'ereditatà e i metodi virtuali.
    In pratica iun qualcosa del genere:

    codice:
    node = getNodeFromXml();//il nodo è di tipo element 
    insert<node>();//e chiamo la funzione relativa ad insert element
    
    node = getNodeFromXml();//il nodo è di tipo Attribute 
    insert<node>();//e chiamo la funzione relativa ad insert attribute
    La differenza tra questo metodo e il meccanismo ereditarietà/metodi virtuali è che il tipo diverso non è determinato dalle mie classi , ma da classi esterne di cui non conosco l'implementazione , ma che definiscono con il loro tipo il comportamento da intraprendere.

    Io sto' cercando di utilizzarlo con un importatore da collada(scusate il tormentone , ma lo uso per fare pratica e studiare ).

    In pratica la sezione che comanda l'importatore collada , ho soperto essere lo scene graph , in cui sono definite le caratteristiche mesh(geometria),materiale e posizione(trasformazioni da effettuare per posizionare un oggetto nella scena) che vanno estratte da sezioni diverse all'interno dell'xml.
    Esplorando questo he non è altro che un grafo con vari tipi di nodi mi vorrei comportare diversamente a seconda del tipo del nodo corrente.

    So che forse la cosa piu' semplice è fare un bell' if con il tipo del nodo , ma da dove lo prendo il tipo del nodo , se non posso mettere mano al codice delle classi di quel tipo?
    Forse un isKindof?
    ma non è un modo propriamente ad oggetti.
    grazie.

  5. #5
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    typeof?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Originariamente inviato da Stoicenko
    Spiega meglio il problema che così è poco chiaro..

    Potrebbe essere utile creare una classe template che si aspetta un tipo della classe base ma che cambia il suo comportamento in base al tipo derivato..
    già.
    Forse ho capito , ho una classe base comune ai 3 tipi, ma per specializzare il tipo derivato nel template come si fa?

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Scusa ma continuo a non capire se il problema lo hai con XML o con collada.
    In XML tutte le interfaccie derivano da Node in maniera polimorfica, quindi in automatico viene richiamata la funzione corretta (che poi restituisca qualcosa dipende dal tipo stesso. Per esempio la proprietà attributes restituisce una NamedNodeMap per i tipi Element, ma NULL per i tipi Attribute.)
    Quindi a meno che di non dover richiamare direttamente funzioni specifiche del tipo che ti interessa (tipo elementsByTagName di Element) non serve fare cast o template o altro.

    Comunque esiste la proprietà nodeType per sapere con che tipo di nodo si ha a che fare.

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.