typedef (s) ermöglichen es, Implementierungen von Schnittstellen zu trennen.
Nehmen wir an, dass das C++ auto
nicht definiert, wie es jetzt definiert ist und decltype
im Standard nicht vorhanden war.
Aber auch jetzt, wenn Sie auto
und decltype
haben, ist es manchmal besser, den Typ eines Objekts explizit anzugeben. Andernfalls kann der Code schwer lesbar sein oder zu Fehlern führen.
ein einfaches Beispiel mit Typspezifizierer Betrachten auto
unsigned int x = 0;
long y = 0;
auto p = new auto(x + y);
Können Sie sagen, was ist der Typ des Zeigers p?
Ist der Ausdruck *p
des Typs unsigned oder signed?
Die Antwort hängt von der verwendeten Plattform ab. Der Typ von p kann entweder long *
oder unsigned long *
sein.
Ein ähnliches Problem existiert für Standardcontainer. Daher führt der Standard allgemeine Typnamen wie size_type
ein, die garantieren, dass dieser Typ ein Typ ohne Vorzeichen ist, aber seine Breite kann je nach Plattform variieren.
Dies ermöglicht auch generischen Code zu schreiben.
In meinem Profil gibt es einen Verweis auf meinen Artikel, wo ich ein Problem zeigen, dass die Standardklasse std::bitset
keinen generischen Typ size_type
hat. In diesem Fall, wenn Sie zum Beispiel die Klasse std::vector<bool>
zu std::bitset
ersetzen müssen, müssen Sie den Code überall dort ändern, wo entweder size_type
oder ein expliziter Typ wie size_t
verwendet wurde.
Bitte geben Sie ein konkretes * Beispiel * an, wo "Dinge wie' auto' und 'declltype'" die Aufgabe erledigen und wo zuvor ein öffentlicher 'typedef' verwendet werden musste. –
Ich denke, dass diese Typen vorhanden sind, so dass die verschiedenen Typeigenschaften, die von den Algorithmen im Algorithmusheader verwendet werden, nicht explizit für jeden Containertyp instanziiert werden müssen. – StoryTeller
Es hilft auch, Lesbarkeit und Wartbarkeit manchmal explizit zu sein. –