Wann _t Postfix?



  • Na dann ist die Frage doch beantwortet, oder?



  • Meine Frage ist nicht wirklich beantwortet. Bisher sehe ich nur Vermutungen. Denn "Gute Frage" ist genauso weit wie ich. 😉



  • sonst frag in comp.std.c++, da kriechen auch die Standardler rum 😉



  • Sind die _t-Sachen nicht nur bei typedefs die von den C-Leuten kommen? size_t, time_t, wchar_t (ist in C++ ja kein typedef), etc. In den C++-Sachen scheinen sie ja eher _type zu benutzen (std::vector<T>::size_type). Ausnahme sind wohl char16_t etc. weil das ähnlicher zu wchar_t ist.

    hmm Ausnahme scheint wohl nullptr_t in C++0x zu sein.


  • Mod

    rüdiger schrieb:

    Sind die _t-Sachen nicht nur bei typedefs die von den C-Leuten kommen? size_t, time_t, wchar_t (ist in C++ ja kein typedef), etc. In den C++-Sachen scheinen sie ja eher _type zu benutzen (std::vector<T>::size_type). Ausnahme sind wohl char16_t etc. weil das ähnlicher zu wchar_t ist.

    hmm Ausnahme scheint wohl nullptr_t in C++0x zu sein.

    Ich hatte nach den ersten Antworten eigentlich angenommen, dass es um den Unterschied zwischen Membertypedefs und globale typedefs geht. Gibt es dafür Gegenbeispiele?



  • Hm.

    Wir müssten entweder ein C typedef finden das _type heisst oder ein C++-only typedef das das _t heisst...
    Hmm...



  • ISO/IEC 14882:2003 20.3 schrieb:

    // 20.3.8, adaptors:
    template<class S, class T> class mem_fun_t;
    template<class S, class T, class A> class mem_fun1_t;
    (...)
    template<class S, class T> class mem_fun_ref_t;
    template<class S, class T, class A> class mem_fun1_ref_t;


  • Mod

    hustbaer schrieb:

    Hm.

    Wir müssten entweder ein C typedef finden das _type heisst oder ein C++-only typedef das das _t heisst...
    Hmm...

    Nachdem ich mich gerade durch die halbe Standardbibliothek geklickt habe, würde ich sagen, das ist es.

    _t: Kram, der in std liegt (bzw. global wenn man die .h-Header nimmt) und dabei keinen anderen Namen hat (z.B. string).
    _type: Kram, der Teil einer Klasse ist und dabei keinen anderen Namen hat.

    Die Frage ist nun natürlich, wann etwas einen eigenen Namen verdient und wann es bloß ein Typ ist.


  • Mod

    seldon schrieb:

    ISO/IEC 14882:2003 20.3 schrieb:

    // 20.3.8, adaptors:
    template<class S, class T> class mem_fun_t;
    template<class S, class T, class A> class mem_fun1_t;
    (...)
    template<class S, class T> class mem_fun_ref_t;
    template<class S, class T, class A> class mem_fun1_ref_t;

    Und?

    edit: Ach, du beziehst dich auf das typedef. Ja, das war nicht ganz richtig (string ist ja auch ein typedef). Siehe der Beitrag über diesem für eine genauere Definition.



  • Ich gehe davon aus, dass da viel einfach von bestehenden Implementationen übernommen worden ist. Für die von C übernommenen Teile gilt das eh, und bei den anderen Teilen macht es in Abwesenheit guter Gründe wenig Sinn, bestehende Konventionen zu verändern und damit bestehenden Code kaputt zu machen.

    Es ist ja auch nicht so, dass die Frage, ob jetzt _t oder _type benutzt wird, in der Praxis eine große Rolle spielt - viele typedefs haben keins der beiden; std::string wurde schon genannt, es gilt aber auch für std::ostream und Konsorten, und innerhalb von Klassen finden sich typedefs iterator, pointer, reference etc. Wichtig ist, dass die Namen einheitlich festgelegt sind, also nicht std::vector ein typedef iterator, std::list ein typedef iterator_t und std::deque ein typedef iterator_type enthält. Ansonsten wird vor allem das festgeschrieben worden sein, was vorher schon bestand.



  • Bei string wird also kein _t nötig gewesen sein, weil das Template basic_string heißt? Würde das Template string heißen, würden wir heute mit string_t hantieren?

    Das mit _type ist einfach: alle typedefs in einer Klasse.



  • Artchi schrieb:

    Bei string wird also kein _t nötig gewesen sein, weil das Template basic_string heißt? Würde das Template string heißen, würden wir heute mit string_t hantieren?

    Das mit _type ist einfach: alle typedefs in einer Klasse.

    Ich glaube, dass es erst eine string-Klasse gab, bevor sie die Verallgemeinerung als basic_string eingeführt haben. string_t hätten sie vermutlich nicht eingeführt aber vielleicht string<>


  • Mod

    Artchi schrieb:

    Das mit _type ist einfach: alle typedefs in einer Klasse.

    Aber auch nicht alle. Z.B. vector::reference & Co.


Anmelden zum Antworten