typedef in Verbindung mit Templates


  • Administrator

    MrMilk schrieb:

    Bzw. wie kann ich nun den Typ 'fahrzeug' nutzen?

    fahrzeug ist das gleiche, wie wenn du car<geschwindigkeit,automobil> hinschreiben würdest. Damit musst du nicht mehr immer alle Templateparameter explizit angeben. Nutzt man zum Beispiel auch oft bei den STL Container:

    typedef std::map<std::string, std::string> Dictionary;
    
    Dictionary dictionary;
    // statt:
    std::map<std::string, std::string> dictionary;
    
    // oder dann:
    Dictionary::const_iterator iter = dictionary.find("hello");
    // statt:
    std::map<std::string, std::string>::const_iterator iter = dictionary.find("hello");
    

    Grüssli



  • template< geschwindigkeit < 100, true>
    struct car
    {
    .. Struktur A ..
    }
    

    sowas gibts nicht. wenn der erste Parameter ein int sein soll dann musst du auch einen übergeben. sowas wäre möglich:

    template <int geschwindigkeit>
    struct car<geschwindigkeit, true>
    {
     /* ... */
    };
    

    Schreib am Besten den Code den du wirklich vorfindest und nicht etwas was so ähnlich aussieht, aber keinen Sinn ergibt 😉

    MrMilk schrieb:

    typedef car<geschwindigkeit,automobil> fahrzeug
    

    Sowas geht nur wenn geschwindigkeit und automobil vorher festgelegt wurden, z.B.

    typedef car<100, true> lahmesauto;
    typedef car<280, true> flotterflitzer;
    


  • pumuckl schrieb:

    Schreib am Besten den Code den du wirklich vorfindest und nicht etwas was so ähnlich aussieht, aber keinen Sinn ergibt 😉

    Klar. Hatte die Datei nicht richtig eingebunden und somit keinen Fehler erhalten. Erst nach den abschicken viel mir auf, dass es noch voller Fehler ist. Werde mich bessern 🙂

    Aber noch einmal eine Frage:

    Also macht das Nutzen eine Typdefinition nur Sinn, wenn ich schon feste Werte angebe, richtig? (Wie in deinem Beispiel)

    typedef car<100, true> lahmesauto;
    typedef car<280, true> flotterflitzer;
    

    Wogegen so etwas nicht viel Sinn macht:

    typedef car<geschwindigkeit,automobil> fahrzeug
    

    Mann könnte das Kind noch aus dem Brunnen ziehen mit:

    #define geschwindigekeit 100
    #define automobil false
    

    Viele Grüße
    MM



  • MrMilk schrieb:

    Mann könnte das Kind noch aus dem Brunnen ziehen mit:

    #define geschwindigekeit 100
    #define automobil false
    

    #define ist doof.

    const int geschwindigkeit = 100;
    const bool automobil = false;
    


  • MrMilk schrieb:

    Wogegen so etwas nicht viel Sinn macht:

    typedef car<geschwindigkeit,automobil> fahrzeug
    

    Macht keinen Sinn und compiliert auch nicht. "typedef xy fahrzeug" heißt, dass du danach fahrzeug als eigenen Typ verwenden kannst. Wenn du das Template nicht explizit instantiierst kann der Compiler nicht wissen welche Instanz von car denn Fahrzeug nun sein soll.



  • pumuckl schrieb:

    Macht keinen Sin und Compiliert auch nicht.

    Genau das wollte ich hören 🙂

    Viele Dank an alle für die Hilfe.



  • MrMilk schrieb:

    pumuckl schrieb:

    Macht keinen Sin und Compiliert auch nicht.

    Genau das wollte ich hören 🙂

    Ohweh, ich hätt das so nicht lesen wollen. Memo an mich selbst: nochmal durchlesen was ich geschrieben hab...



  • Leider muss ich noch einmal dieses alte Thema öffnen.

    Momentan macht mir ein typedef zu schaffen. Und zwar sieht es wie folgt aus:

    template <int geschwindigkeit>
    struct car<geschwindigkeit, true>
    {
     typedef unsigned int type;
    };
    
    template <int geschwindigkeit>
    struct car<geschwindigkeit, false>
    {
     typedef int type;
    };
    

    Ist so etwas möglich? Falls ja wie kann ich dann etwas von dem Typ type deklarieren?

    Viele Grüße
    MM


  • Administrator

    Wieso sollte es nicht?

    #include <iostream>
    
    template<int, bool>
    struct Foo // ist bereits <X, false>, wegen der nachfolgenden Spezialisierung
    {
      typedef double Type;
    };
    
    template<int A>
    struct Foo<A, true>
    {
      typedef int Type;
    };
    
    void bar(double)
    {
      std::cout << "double" << std::endl;
    }
    
    void bar(int)
    {
      std::cout << "int" << std::endl;
    }
    
    int main()
    {
      Foo<234, true>::Type first;
      Foo<323, false>::Type second;
    
      bar(first); // gibt int aus
      bar(second); // gibt double aus
    
      return 0;
    }
    

    Grüssli



  • Danke hast wie immer recht!

    Leider bleibt noch eine Anfängerfrage offen. Wieso :: und nicht. ?
    Es ist doch kein neuer Namespace, oderß

    Viele Grüße
    MM



  • Der Doppelpunkt ist der allgemeine Scope-Operator (egal ob Namensbereiche, Klassen oder Strukturen). Mit dem Punkt-Operator wird nur auf Member (Variablen bzw. Funktionen) zugegriffen.


Anmelden zum Antworten