Template Definition



  • Morgen,

    ich hätte da mal kurz eine Frage. Unzwar habe ich ein älteres Buch hier in dem Templates in C++ erklärt werden. In dem Buch wird zur Definitionen aber immer Class benutzt.

    template<class T>
    class irgendwas
    {
    }
    

    wenn ich mir aber Code im Internet ansehe wird aber zB auch typename oder typedef verwendet. Die Verwendung von typedef habe ich schonmal in einem anderen Fall gesehen und ergibt für mich hier keinen Sinn. Wann benutze ich class und wann typename?

    edit: vielleicht kann mir jemand noch, wenn er so lieb ist, einen typischen Fall nennen, wo man templates benutzt. Ich weiß zwar was templates können, aber mir will zum verrecken kein Fall einfallen, wo ich es einsetzen würde. Vielleicht war ich auch noch nie so weit in Projekten, dass ich das benötigte.


  • Mod

    Bennisen schrieb:

    Morgen,

    ich hätte da mal kurz eine Frage. Unzwar habe ich ein älteres Buch hier in dem Templates in C++ erklärt werden. In dem Buch wird zur Definitionen aber immer Class benutzt.

    template<class T>
    class irgendwas
    {
    }
    

    wenn ich mir aber Code im Internet ansehe wird aber zB auch typename oder typedef verwendet. Die Verwendung von typedef habe ich schonmal in einem anderen Fall gesehen und ergibt für mich hier keinen Sinn. Wann benutze ich class und wann typename?

    Wenn dein Buch nicht gerade älter als 20 Jahre ist, sollte es diese Frage beantworten. Dein Code enthält zwei class Schlüsselworte. Innerhalb der der Templateargumentliste kann statt class auch typename verwendet werden. Dies hat keinerlei Auswirkungen auf die Bedeutung des Codes, es bleibt also dir überlassen.



  • Hi,

    wenn ich das richtig weis, wurde ursprünglich "class" benutzt. Aber um dem Keywort nicht mehrere Bedeutungen zu geben, hat man hinterher "typename" eingeführt. Aber aus Rückwärtskompatibiliätsgründen darf man class dort weiterhin einsetzen.

    Typedef habe ich in dem Zusammenhang noch nicht gesehen.

    Wo man das brauchen kann? An vielen Stellen 😉

    z.B. bei verketteten Listen. Du brauchst an verschiedenen Stellen eine Liste, aber immer mit einem anderen Datentyp, den du in den Nodes speichern möchtest. Anstelle von mehreren Überladungen, bei denen du dir auch immer neue Getter und Setter o.ä. schreiben musst, machst du das halt in einer Template Klasse, die auf beliebigen Datentypen arbeiten kann.



  • Schlangenmensch schrieb:

    z.B. bei verketteten Listen. Du brauchst an verschiedenen Stellen eine Liste, aber immer mit einem anderen Datentyp, den du in den Nodes speichern möchtest. Anstelle von mehreren Überladungen, bei denen du dir auch immer neue Getter und Setter o.ä. schreiben musst, machst du das halt in einer Template Klasse, die auf beliebigen Datentypen arbeiten kann.

    Hmm, also bisher waren Vektoren für mich immer ausreichend, aber ich verstehe was du meinst. So komplex war keines meiner Projekte bisher.



  • Vektoren sind auch so ein Beispiel. Der std::vector ist eine Template Klasse, damit du da beliebige Datentypen rein stecken kannst 😉



  • Bennison, einen Unterschied macht es bei template template params.

    Da _musst_ du class verwenden für den Template-Typ.


  • Mod

    Schlangenmensch schrieb:

    wenn ich das richtig weis, wurde ursprünglich "class" benutzt. Aber um dem Keywort nicht mehrere Bedeutungen zu geben, hat man hinterher "typename" eingeführt. Aber aus Rückwärtskompatibiliätsgründen darf man class dort weiterhin einsetzen.

    Also da wurde ein Fehler gefunden und daraufhin etwas geändert, ohne den Fehler zu beseitigen? Ergibt das irgendeinen Sinn für dich?
    Es ist ja nicht schlimm etwas nicht zu wissen, schon gar nicht in diesem speziellen Fall. Aber wenn du dir etwas aus den Fingern saugst, solltest es wenigstens einer oberflächlichen Logikprüfung standhalten können.



  • Mir aus den Fingern sagenu? Wie wäre es erstmal mit ein bisschen eigener recherche bevor du andere so angehst.

    Hier mal ein Auszug von Stan Lippman https://blogs.msdn.microsoft.com/slippman/2004/08/11/why-c-supports-both-class-and-typename-for-type-parameters/

    The committee decided that a new keyword was just the ticket to get the compiler off its unfortunate obsession with expressions. The new keyword was the self-describing typename. When applied to a statement, such as,

    typename T::A* a6; // declare pointer to T’s A

    it instructs the compiler to treat the subsequent statement as a declaration. Since the keyword was on the payroll, heck, why not fix the confusion caused by the original decision to reuse the class keyword. Of course, given the extensive body of existing code and books and articles and talks and postings using t[code="css"]he class keyword, they chose to also retain support for that use of the keyword as well. So that’s why you have both.

    Auf Stackoverflow gibt es auch jede Menge Beiträge dazu, mit einem ähnlichen Konsens.

    Und, da es auch mal sein kann sich an was falsch zu erinnern, dann wäre eine Verbesserung doch deutlich besser als anderen vorzuwerfen, sich einfach was ausgedacht zu haben.


  • Mod

    Schlangenmensch schrieb:

    Mir aus den Fingern sagenu? Wie wäre es erstmal mit ein bisschen eigener recherche bevor du andere so angehst.

    Hier mal ein Auszug von Stan Lippman https://blogs.msdn.microsoft.com/slippman/2004/08/11/why-c-supports-both-class-and-typename-for-type-parameters/

    The committee decided that a new keyword was just the ticket to get the compiler off its unfortunate obsession with expressions. The new keyword was the self-describing typename. When applied to a statement, such as,

    typename T::A* a6; // declare pointer to T’s A

    it instructs the compiler to treat the subsequent statement as a declaration. Since the keyword was on the payroll, heck, why not fix the confusion caused by the original decision to reuse the class keyword. Of course, given the extensive body of existing code and books and articles and talks and postings using the class keyword, they chose to also retain support for that use of the keyword as well. So that’s why you have both.

    Na, das ist das genau Gegenteil dessen, das du zuvor geschrieben hast:

    Aber um dem Keywort nicht mehrere Bedeutungen zu geben, hat man hinterher "typename" eingeführt.

    typename wurde aus anderen Grund eingeführt. Und nachdem es einmal da war, hat man sich entschlossen, es auch in Templateparameterlisten an Stelle von class zuzulassen.
    Und meine Kritik bezog sich eben nicht primär darauf, dass dein Beitrag einfach falsch war, sondern schlicht sinnlos, was man bereits ohne Kenntnis von Fakten erkennen kann.


Log in to reply