Kursinhalt
C++-Vorlagen
C++-Vorlagen
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.
main
#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.
main
#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.
main
#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.
vector
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.
Danke für Ihr Feedback!