Was haltet ihr hier von? #define TEMP template<class T>



  • Ich fasse das mal als Scherz auf.



  • Schön, ich habe schon sehnsüchtig auf das Freitag-Nachmittag-Ticket gewartet 😃



  • king of templer schrieb:

    Hier das ultimative Shortcutmacro:

    #define TMPL /* magic */
    
    TMPL(T) // -> template<typename T>
    T default_value() { return T{}; }
    
    TMPL(T S U) // -> template<typename T, typename S, typename U>
    T sum(S const& s, U const& u) { return s+u; }
    
    TMPL(int_I) // -> template<int I>
    int int_id() { return I; }
    
    int main()
    {
      std::cout << int_id<3>() << '\n';
      std::cout << default_value<double>() << '\n';
      std::cout << sum<long double>(1.0, 2.1f) << '\n';
    }
    

    Wer die Magie (aka WTF-Erlebnis) bestaunen will: http://ideone.com/kTKkMB

    PI?
    Dir ist schon klar, dass das ungefähr Zehn bis Zwanzig mal unlesbarer ist als wenn man ganz normal deklarieren würde?

    pumuckl schrieb:

    Der Tobi schrieb:

    Was ist dann eine Templateklasse? Eine Instanz einer dieser Vorlagen, oder eine spezielle Klasse, die aus der Vorlage bzw. dem Klassentemplate vom Compiler für einen bestimmten Typ T erstellt wird?

    Was das selbe ist - genau das würde man als Template-Klasse bezeichnen, ja.

    Naja ne. Das ist dann einfach nur eine Klasse, oder.

    Der Begriff ist mMn Sinnfrei.



  • quiek schrieb:

    Immer template<class T> im Code zu schreiben macht den Code irgendwie unübersichtlich was haltet ihr davon ein define zu verwenden?

    Nichts.
    Die paar Buchstaben kann und sollte man selbst tippen. Bzw. die Auto-Completion der IDE tippen lassen.
    Templates sind ein wichtiger Bestandteil der Sprache, und man sollte die Syntax verstehen. Eine weitere komische Makro-Syntax zusätzlich zu können hat da keinen Mehrwert.
    Neu dazukommende Entwickler können den Code nicht lesen und müssen sich erstmal das komische Makro ansehen.
    Es erschwert die Wartbarkeit - wenn man etwas ändern will muss man u.U. das Makro wieder entfernen und erst wieder alles mit Hand hinschreiben. Oder man darf viel Zeit damit verbringen ein neues Makro zu schreiben das den neuen Fall auch noch abdeckt.

    Alles in allem: du machst damit alles schlimmer und nichts besser. Dass es dir vorteilhaft erscheint liegt vermutlich einfach daran dass du die Syntax noch nicht so verinnerlicht hast dass du einfach drüberlesen kannst ohne dabei das Hirn einschalten zu müssen.


  • Mod

    Sone schrieb:

    pumuckl schrieb:

    Der Tobi schrieb:

    Was ist dann eine Templateklasse? Eine Instanz einer dieser Vorlagen, oder eine spezielle Klasse, die aus der Vorlage bzw. dem Klassentemplate vom Compiler für einen bestimmten Typ T erstellt wird?

    Was das selbe ist - genau das würde man als Template-Klasse bezeichnen, ja.

    Naja ne. Das ist dann einfach nur eine Klasse, oder.

    Der Begriff ist mMn Sinnfrei.

    mMn ist immerhin schon etwas weg von Unfug.

    Immerhin handelt es sich ja bei "template class" fast um einen Begriff des Standards.
    Fast, weil nur "non-template class" an mehreren Stellen (ohne formale Definition) verwendet wird.
    Wer mag, schreibt explizite Klassentemplatespezialisierung. Verständlicher wird es dadurch nicht.

    Jedenfalls ist eine Templateklasse etwas anderes als ein Klassentemplate. Ich würde es also begrüßen, wenn Kellerautomat entsprechend reflexartige - und dann tatsächlich sinnfreie - "Korrekturen" unterlässt.



  • Wer mag, schreibt explizite Klassentemplatespezialisierung.

    Meinst du generierte Klassentemplatespezialisierung? Die explizite hat doch hiermit nichts zu tun.


  • Mod

    Sone schrieb:

    Wer mag, schreibt explizite Klassentemplatespezialisierung.

    Meinst du generierte Klassentemplatespezialisierung? Die explizite hat doch hiermit nichts zu tun.

    Ich meine es genau so, wie ich es geschrieben habe.



  • also eine templateklasse ist für mich eine klasse von templates.

    sprich eine gewisse art von templates. was das ist steht auf einem anderen blatt (was wahrscheinlich noch gar nicht sauber geschrieben wurde)



  • camper schrieb:

    Jedenfalls ist eine Templateklasse etwas anderes als ein Klassentemplate. Ich würde es also begrüßen, wenn Kellerautomat entsprechend reflexartige - und dann tatsächlich sinnfreie - "Korrekturen" unterlässt.

    Nimmst du, wenn du einen Hasen zeichnen willst, eine Hasen-Schablone oder einen Schablonenhasen?
    Mich wuerde interessieren, was dann deiner Meinung nach eine "Templateklasse" ist.



  • Skym0sh0 schrieb:

    also eine templateklasse ist für mich eine klasse von templates.

    sprich eine gewisse art von templates. was das ist steht auf einem anderen blatt (was wahrscheinlich noch gar nicht sauber geschrieben wurde)

    Hmm, du hast Recht! Das ergibt Sinn. 👍


  • Mod

    Kellerautomat schrieb:

    camper schrieb:

    Jedenfalls ist eine Templateklasse etwas anderes als ein Klassentemplate. Ich würde es also begrüßen, wenn Kellerautomat entsprechend reflexartige - und dann tatsächlich sinnfreie - "Korrekturen" unterlässt.

    Nimmst du, wenn du einen Hasen zeichnen willst, eine Hasen-Schablone oder einen Schablonenhasen?
    Mich wuerde interessieren, was dann deiner Meinung nach eine "Templateklasse" ist.

    Die (Hasen-)Schablone wird benutzt, um einen (Schablonen-)Hasen zu zeichnen. Ganz einfach.

    Sone schrieb:

    Skym0sh0 schrieb:

    also eine templateklasse ist für mich eine klasse von templates.

    sprich eine gewisse art von templates. was das ist steht auf einem anderen blatt (was wahrscheinlich noch gar nicht sauber geschrieben wurde)

    Hmm, du hast Recht! Das ergibt Sinn. 👍

    Eine Templateklasse ist eine Klasse ganz in dem Sinne, wie C++ den Begriff Klasse versteht.
    Außerdem hat eine solche Klasse eine Template-id, ist also eine Spezialisierung eines (Klassen-)Templates. Und weil diese Spezialisierung alle Templateparameter bestimmt, handelt es sich um eine explizite (also vollständige) Spezialisierung.



  • Und weil diese Spezialisierung alle Templateparameter bestimmt, handelt es sich um eine explizite (also vollständige) Spezialisierung.

    ?
    Im Standard ist doch der Begriff explicit specialization deutlich definiert:

    An explicit specialization [...] can be declared by a declaration introduced by template<>; that is:
    explicit-specialization:
    template < > declaration

    Entweder ich habe völlig missverstanden was du überhaupt meinst, oder du hast dich falsch ausgedrückt.



  • @camper: Du meinst Instanzierungen?



  • vector<int> ist eine Template-Id. Und sobald irgendwo diese Template-Id als Klasse verwendet wird, generiert der Compiler eine Spezialisierung des entsprechenden Klassentemplates (daher auch der Name generierte ~) und die Template-ID repräsentiert dann diese generierte Klasse.


  • Mod

    Sone schrieb:

    Und weil diese Spezialisierung alle Templateparameter bestimmt, handelt es sich um eine explizite (also vollständige) Spezialisierung.

    ?
    Im Standard ist doch der Begriff explicit specialization deutlich definiert:

    An explicit specialization [...] can be declared by a declaration introduced by template<>; that is:
    explicit-specialization:
    template < > declaration

    Entweder ich habe völlig missverstanden was du überhaupt meinst, oder du hast dich falsch ausgedrückt.

    Möglicherweise hast du bemerkt, dass an der Stelle kursiver Text verwendet wird. Schau einfach mal in Kapitel 1.6 nach, was das bedeutet. Die Diskussion hier dreht sich schließlich nicht um syntaktische Katgeorien oder Produktionen.


  • Mod

    Sone schrieb:

    vector<int> ist eine Template-Id.

    richtig.

    Und sobald irgendwo diese Template-Id als Klasse verwendet wird,

    und dieser Kontekt die Existenz der Definition der Klasse erfordert (ODR) instantiiert der Compiler diese Klasse, sofern diese nicht zuvor bereits deklariert oder instantiiert wurde.
    Eine Instantiierung kann implizit oder explizit erfolgen und erzeugt die Klasse aus dem Primärtemplate oder der anzuwendenden partiellen Templatspezialisierung (eine partielle Spezialisierung ist ein Template). Das Resultat ist dann eine instantiierte Templateklasse bzw. eine instantiierte Templatefunktion.
    Eine explizite Spezialisierung kann auch deklariert werden, in diesem Falle wird sie gerade nicht instantiiert (sondern muss, sofern sie verwendet wird, auch (explizit) definiert werden).
    Eine explizite Spezialisierung ist kein Template.
    Kapitel 14.7 Template instantiation and specialization hat 3 Unterkapitel
    14.7.1 Implicit instantiation
    14.7.2 Explicit instantiation
    14.7.3 Explicit specialization
    das korrespondiert mit dem gesagten (wobei sich das letzte Kapitel um Deklarationen expliziter Spezialisierungen dreht, wie gleich der erste Satz deutlich macht.

    generiert der Compiler eine Spezialisierung des entsprechenden Klassentemplates (daher auch der Name generierte ~) und die Template-ID repräsentiert dann diese generierte Klasse.

    das stimmt im Prinzip, wenn generieren=instantiieren gemeint ist (s.o.)



  • Eine explizite Spezialisierung ist kein Template.

    Hat keiner gesagt. 😃

    Ja, ich sehe, ich hab da die Begrifflichkeiten durcheinander gebracht. Danke für die Klarstellung.

    P.S.: Ja, mit generieren war instantiieren gemeint.


Anmelden zum Antworten