Beim Arbeiten mit Templates herausfinden welchen Typ eine Variable hat



  • Hallo,

    gibt es eine Möglichkeit die Art (char, int, float, ...) einer übergebene Variable herauszubekommen?
    Das wäre nützlich wenn man z.B. mit Templates arbeitet.



  • Das macht man mit Template-Spezialisierung

    #include <iostream>
    
    template<typename T>
    struct foo {
      foo() {
        std::cout << "foo<T>::foo()\n";
      }
    };
    
    template<>
    struct foo<char> {
      foo() {
        std::cout << "foo<char>::foo()\n";
      }
    };
    
    int main() {
      foo<int> a;
      foo<char> b;
    }
    


  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke für deine Antwort,

    aber in dem Fall kann ich ja auch die Methode überladen und muss nicht zwangsläufig mit Templates arbeiten.
    Gibt es keine Möglichkeit, das alles in einem Template zu realisieren, welches dan selber
    herausfindet was für eine Variable übergeben worden ist?

    MFG

    r@ptor



  • Der Typ einer übergebene Variable einer Funktion wie

    template<class T>void foo(T);
    

    ist T. Was T symbolisiert ist egal, es sei denn du willst jenachdem was T ist etwas besonderes machen. Genau dafür sind spezialisierungen...



  • ness: Was soll das da?

    r@ptor: Das, was du brauchst, steht nicht im Standard. Manche Compiler unterstützen es trotzdem, z.B. mit RTTI (runtime type identification).



  • @Michael E. Hä? Das ist ein Beispiel. Ich versuche gerde herauszufinden, was r@ptor erreichen will...



  • schau dir RTTI an



  • Na RTTI is hier wohl unnötig, wenn er schon mit Templates arbeitet.
    Alles was man damit machen kann ist mit typeid und if-else Kaskaden
    versuchen den Typ rauszufinden, das kann er zur Compilezeit aber auch.
    Wozu also unnötig Laufzeit verschwenden ?

    Entweder man spezialisiert oder verwendet
    Trait-Klassen wie boos::is_same ..



  • Tankian schrieb:

    Na RTTI is hier wohl unnötig, wenn er schon mit Templates arbeitet.

    Kommt drauf an, was er überhaupt tun will. Es gibt genug gute Anwendungsfälle für RTTI in templates (hallo, boost::any).



  • r@ptor schrieb:

    Hallo,

    gibt es eine Möglichkeit die Art (char, int, float, ...) einer übergebene Variable herauszubekommen?
    Das wäre nützlich wenn man z.B. mit Templates arbeitet.

    es kommt drauf sn, was genau du machen willst, und in welcher form du diese information erhalten willst.

    du könntest zb sowas machen:

    template<class T>
    void fun(T op){
        if(is_same<T,char>::Value!=-1){//compiletime konstanter ausdruck, if wird rausoptimiert
            doThis();
        }
        else
        {
            doThat();
        }
    }
    

    dann gibts zb noch was mit typlisten:

    template<class T>
    void fun(T op){
        typedef TYPELIST_5(bool,char,short,int,long) integral;
        if(getPos<integral,T>::value){
             //T ist ein integral typ
        }
    }
    

    dies sind alles nur pseudocode beispiele, es gibt noch 1000 mehr möglichkeiten irgendwelche infos herauszubekommen, es kommt nur immer drauf an, welche



  • ness schrieb:

    @Michael E. Hä? Das ist ein Beispiel. Ich versuche gerde herauszufinden, was r@ptor erreichen will...

    Klar 🙄


Anmelden zum Antworten