Klasse Skabelon Argument Deduktion
Stryg for at vise menuen
Du har måske allerede brugt nogle af dem uden at være klar over, at de var skabeloner til at begynde med, muligvis på grund af Class Template Argument Deduction (CTAD).
Med C++17 kan vi udnytte Class Template Argument Deduction (CTAD). Denne funktion gør det muligt at oprette instanser af vores skabelonklasser uden eksplicit at angive skabelontyperne. I stedet udleder compileren typerne baseret på konstruktørens parametre. Lad os se på nogle eksempler med 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; }
Tidligere var dette den eneste måde at oprette en instans af std::pair på. Nu er det dog muligt at udelade <int, char>. Prøv at fjerne det og kør koden igen.
Argumentdeduktion for klassetemplates udføres kun, hvis der ikke er angivet en liste af templateargumenter. Hvis en templateargumentliste er angivet, finder deduktion ikke sted.
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; }
Når der oprettes et objekt med et enkelt argument, der matcher en bestemt type af en klasse-skabelon, foretrækker CTAD at bruge denne type direkte, hvilket forenkler instansiering for brugerdefinerede skabelonklasser. For eksempel kan brugere med en skabelonklasse som Box instantiere den uden at angive typeargumenter, når konstruktørargumenter gives.
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 kan gøre vedligeholdelse af kode lettere. Hvis de underliggende typer ændres, er der mindre kode, der skal opdateres, hvilket fører til færre muligheder for fejl.
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>
Ved brug af containere eller wrappers med specifikke konstruktører kan CTAD forenkle koden. Antag, at du har en brugerdefineret Matrix- eller Vector-klasse, der indkapsler en underliggende datatype. Ved at bruge CTAD her kan du sikre, at typenedledning sker automatisk baseret på de givne argumenter, hvilket forbedrer læsbarhed og fleksibilitet.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat