Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Klassentemplate-Argumentableitung | Klassenvorlagen
C++-Vorlagen
course content

Kursinhalt

C++-Vorlagen

C++-Vorlagen

1. Erstellen der Ersten Vorlage
2. Verwendung von Templates
3. Klassenvorlagen
4. Templatespezialisierung

book
Klassentemplate-Argumentableitung

Möglicherweise haben Sie einige von ihnen bereits verwendet, ohne zu erkennen, dass es sich zunächst um Templates handelte, möglicherweise aufgrund der Class Template Argument Deduction (CTAD).

Mit C++17 können wir die Class Template Argument Deduction (CTAD) nutzen. Dieses Feature ermöglicht es uns, Instanzen unserer Template-Klassen zu erstellen, ohne die Template-Typen explizit anzugeben. Stattdessen leitet der Compiler die Typen basierend auf den Konstruktorparametern ab. Schauen wir uns einige Beispiele mit std::pair an.

cpp

main

copy
12345678
#include <iostream> #include <utility> // for std::pair int main() { std::pair<int, char> my_pair(1, 'a'); std::cout << my_pair.first << " : " << my_pair.second << std::endl; }

Hinweis

Früher war dies der einzige Weg, um eine Instanz von std::pair zu erstellen. Jetzt ist es jedoch möglich, den <int, char>-Teil wegzulassen. Versuchen Sie, ihn zu entfernen und führen Sie den Code erneut aus.

Die Argumentableitung für Klassenvorlagen wird nur durchgeführt, wenn keine Vorlagenargumentliste vorhanden ist. Wenn eine Vorlagenargumentliste angegeben ist, findet keine Ableitung statt.

cpp

main

copy
12345678
#include <iostream> #include <utility> // for std::pair int main() { std::pair<> my_pair(1, 'a'); // Error std::cout << my_pair.first << " : " << my_pair.second << std::endl; }

Wenn ein Objekt mit einem einzelnen Argument erstellt wird, das einem bestimmten Typ einer Klassenvorlage entspricht, bevorzugt CTAD die direkte Verwendung dieses Typs, was die Instanziierung für benutzerdefinierte Vorlagenklassen vereinfacht. Zum Beispiel können Benutzer mit einer Vorlagenklasse wie Box diese instanziieren, ohne Typargumente anzugeben, wenn sie Konstruktorargumente bereitstellen.

cpp

main

copy
123456789101112131415
#include <iostream> template <typename T> class Box { T value; public: Box(T value): value(value) {} }; int main() { // No need to write Box<int> a{1}; Box a{1}; // Deduction: Box<int> Box b{a}; // Deduction: Box<int>, not Box<Box<int>> }

CTAD kann die Wartung des Codes erleichtern. Wenn sich die zugrunde liegenden Typen ändern, gibt es weniger Code zu aktualisieren, was zu weniger Gelegenheiten für Fehler führt.

h

vector

copy
12345678
template <typename T> class Vector3D { T x, y, z; public: Vector3D(T x, T y, T z) : x(x), y(y), z(z) {} }; Vector3D vec{1.0, 2.0, 3.0}; // CTAD deduces Vector3D<double>

Beim Verwenden von Containern oder Wrappern mit spezifischen Konstruktoren kann CTAD den Code vereinfachen. Angenommen, Sie haben eine benutzerdefinierte Matrix- oder Vector-Klasse, die einen zugrunde liegenden Datentyp umschließt. Die Verwendung von CTAD kann hier helfen, sicherzustellen, dass die Typableitung automatisch basierend auf den bereitgestellten Argumenten erfolgt, was die Lesbarkeit und Flexibilität verbessert.

Was ist die Klassenvorlagen-Argumentableitung (CTAD)?

Was ist die Klassenvorlagen-Argumentableitung (CTAD)?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 3. Kapitel 4
We're sorry to hear that something went wrong. What happened?
some-alt