Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C++] Tipi

  1. #1

    [C++] Tipi

    Un problema forse banale.

    Supponiamo che voglia implementare una funzione del tipo:

    codice:
    template <typename T>
    void funzione( T );
    Come faccio a determinare il tipo dell'argomento passato in fase di esecuzione?

    Con parole più semplici: come implementare ad esempio una cosa come:

    codice:
    if( "tipo dell'argomento " == "int" )
    {
         ... esegui determinate istruzioni
    }
    
    else if( "tipo dell'argomento " == "double" )
    {
         ... esegui altre istruzioni
    }

    Una cosa semplice, o meglio semplicistica, ma errata sarebbe l'utilizzo dell'operatore sizeof, ma appunto è errata per evidenti motivazioni...

  2. #2
    Se ti trovi in una situazione del genere, probabilmente i template non vanno bene per il tuo scopo, e devi usare invece il normale overloading delle funzioni. I template vanno bene quando il codice è il medesimo per qualunque tipo si voglia operare.
    Se invece ti trovi in una situazione mista (stesso codice per la maggior parte dei casi, codice diverso solo per qualche caso) puoi scrivere la funzione generale template e le specializzazioni per tipi particolari a parte.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    Se ti trovi in una situazione del genere, probabilmente i template non vanno bene per il tuo scopo, e devi usare invece il normale overloading delle funzioni. I template vanno bene quando il codice è il medesimo per qualunque tipo si voglia operare.
    Se invece ti trovi in una situazione mista (stesso codice per la maggior parte dei casi, codice diverso solo per qualche caso) puoi scrivere la funzione generale template e le specializzazioni per tipi particolari a parte.
    Capisco...

    Quindi non esiste niente (operatore/funzione/macro/...) capace di determinare run-time il tipo di una variabile?

  4. #4
    C'è l'operatore typeid; di solito si usa in ambito di polimorfismo a runtime, ma nulla impedisce di usarlo anche in questa maniera, per quanto non ne capisco l'utilità: se il tipo è noto a compile time, conviene risolverlo tramite overload.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    L'operatore typeid dovrebbe andare, grazie.

    Per quanto riguarda l'overload di funzioni sarebbe decisamente proibitivo, o comunque "noioso". Considera che se avessi una funzione del genere:

    codice:
    template <typename A, typename B, tipename C>
    void funzione( A, B, C );
    Se considerassi anche solo 8 tipi differenti dovrei implemetare 8^3 = 512 funzioni diverse!

    Giusto?

  6. #6
    Spiega meglio cosa vuoi fare... in linea di massima dovresti tenere template la parte comune, e richiamare una sotto-funzione template con le specializzazioni parziali.
    ---EDIT---
    Anche perché con degli if abbinati a typeid tutto il codice verrebbe comunque compilato, per cui se delle parti di codice non si possono applicare agli altri tipi comunque devono essere con essi sintatticamente compatibili.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Concordo con MItaly: se sei in una situazione del genere vuol dire che stai "programmando" male, o stai cercando a colpi di "barate" di far funzionare cio' che è stato progettato male:
    pensa ad astrarre il problema, più che a generalizzarlo.

  8. #8
    Originariamente inviato da MacApp
    Concordo con MItaly: se sei in una situazione del genere vuol dire che stai "programmando" male, o stai cercando a colpi di "barate" di far funzionare cio' che è stato progettato male:
    pensa ad astrarre il problema, più che a generalizzarlo.
    Giusto, senza contare che typeid richiede troppe risorse per poterpensare di originar un algoritmo efficiente. Cogliendo il suggerimento si MItaly mi sono basato sul semplice overloading di template.

  9. #9
    Originariamente inviato da GliderKite
    Giusto, senza contare che typeid richiede troppe risorse per poterpensare di originar un algoritmo efficiente.
    In questo caso in realtà credo che forse il compilatore sarebbe riuscito a risolverlo completamente a compile-time, per cui non ci sarebbe dovuto essere un grosso overhead. Tuttavia rimaneva un design pessimo.
    Cogliendo il suggerimento si MItaly mi sono basato sul semplice overloading di template.
    Ottimo.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.