Typeid().name() und Templates



  • Hallo zusammen,

    gehe ich richig davon aus, dass ich in einem Template das bspw. so aussieht:

    template <class FooBar>
    void templateFunction()
    {
        std::cout << typeid(Foobar).name() << std::endl;
    }
    
    int main()
    {
        templateFunction<meineKlasse>();
        return 0;
    }
    

    mittels typeid().name() den Typ/Klasse des Templates ermitteln kann?
    Ich frage deshalb, da ich bei der Ausgabe noch etwas mehr als nur das erwartete Ergebnis bekomme.

    9meineKlasse
    

    Ich versteh nicht wirklich was die 9 zu bedeuten hat. Ich frage daher, weil ich in OpenFOAM gerade eine neue thermodynamik Datenbank einbinden muss und das Grundgerüst erstmal verstehen muss. Nachdem ich die Klassen durch hab und die Templates durchgeschaut habe, müsste ich nämlich folgendes bei der oben genannten Ausgabe bekommen: psiThermo

    Ich erhalte aber

    N4Foam9psiThermoE
    

    Das ist ja schon mal gar nicht schlecht, nur ich versteh nicht wirklich was die anderen Dinge zu bedeuten haben. Anmerkungen sind herzlichst willkommen.

    Grüße und ein schönes Wochenende an alle.



  • Das gibt unter den meisten Compilern der sog. mangled name.
    Der ist notwendig um bspw. verschiedene Funktionsoverloads einen eindeutigen Namen zu geben. Der wird von irgendeinem Algorithmus erstellt und ist nicht dazu gedacht sonderlich lesbar zu sein.
    Um an einen lesbaren Namen zu kommen musst du ihn demanglen, das ist ebenfalls Compiler abhängig.



  • Hallo,

    danke für die Info.
    Könnte es sein das es folgendermaßen ist:

    N -> Namespace
    4 -> Anzahl der Ziffern des Namespacenamens (Foam)
    Foam -> Namespacename
    9 -> Anzahl der Ziffern des Typs im Template
    psiThermo -> Typ des Templates.

    Wäre zumindest sehr logisch. Danke noch für deine Info.
    Werde mir das mal anschauen.



  • es gibt auch boost/type_index

    #include <boost/type_index.hpp>
    
    template <typename T>
    void Test()
    {
        std::cout << boost::typeindex::type_id_with_cvr<T>().pretty_name(); // pretty!
    }
    

    Demangling mit dem g++ (gnu compiler collection) (und ich glaube auch clang):

    #include <cxxabi>
    
    template <typename T>
    void printDemangled()
    {
        static const char buffer[1 << 10]; // evtl größer wählen
        int bufferSize = sizeof(buffer);
        memset(buffer, '\0'. bufferSize);
        int status = 0;
        abi::__cxa_demangle(typeid(T).name(), buffer, &bufferSize, &status);
        // ich ignoriere hier status einfach mal und geh davon aus dass alles gut ging.
        std::cout << buffer;
    }
    

    Diese "Lösung" hier ist aber unvöllständig, da typeid dir nicht alle infos liefert.
    Deshalb oben mit boost::typeindex "with_cvr" (const, volatile, reference) für alle Informationen.
    Das ließe sich nat. mit type_traits lösen.


Log in to reply