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
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; }
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
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
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
12345678template <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.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen