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

Klassentemplate-Argumentableitung

Swipe um das Menü anzuzeigen

Möglicherweise hast du einige davon bereits verwendet, ohne zu bemerken, 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. Diese Funktion ermöglicht es, Instanzen von Template-Klassen zu erstellen, ohne die Template-Typen explizit anzugeben. Stattdessen leitet der Compiler die Typen anhand der Konstruktorparameter ab. Im Folgenden einige Beispiele mit std::pair.

main.cpp

main.cpp

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; }
Note
Hinweis

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

Die Argumentableitung für Klassentemplates wird nur durchgeführt, wenn keine Template-Argumentliste vorhanden ist. Wird eine Template-Argumentliste angegeben, findet keine Ableitung statt.

main.cpp

main.cpp

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; }

Bei der Erstellung eines Objekts mit einem einzelnen Argument, das einem bestimmten Typ einer Klassenvorlage entspricht, verwendet CTAD bevorzugt direkt diesen Typ. Dadurch wird die Instanziierung für benutzerdefinierte Template-Klassen vereinfacht. Bei einer Template-Klasse wie Box können Benutzer sie instanziieren, ohne Typargumente anzugeben, wenn sie Konstruktorargumente bereitstellen.

main.cpp

main.cpp

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, muss weniger Code angepasst werden, was zu weniger Fehlern führt.

vector.h

vector.h

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 Einsatz von Containern oder Wrappern mit spezifischen Konstruktoren kann CTAD den Code vereinfachen. Angenommen, Sie haben eine eigene Matrix- oder Vector-Klasse, die einen zugrunde liegenden Datentyp kapselt. Die Verwendung von CTAD sorgt hier dafür, dass die Typableitung automatisch anhand der übergebenen Argumente erfolgt, was die Lesbarkeit und Flexibilität verbessert.

question mark

Was ist Class Template Argument Deduction (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

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 3. Kapitel 4
some-alt