Argumentdeduksjon for Klassetemplater
Sveip for å vise menyen
Du har kanskje allerede brukt noen av dem uten å være klar over at de var maler til å begynne med, muligens på grunn av Class Template Argument Deduction (CTAD).
Med C++17 kan vi dra nytte av Class Template Argument Deduction (CTAD). Denne funksjonen gjør det mulig å opprette instanser av mal-klasser uten å eksplisitt angi maltypene. I stedet utleder kompilatoren typene basert på konstruktørens parametere. La oss se på noen 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åten å opprette en instans av std::pair på. Nå er det imidlertid mulig å utelate <int, char>. Prøv å fjerne det og kjør koden på nytt.
Argumentdeduksjon for klassetemplater utføres kun hvis det ikke er angitt noen liste med template-argumenter. Hvis en template-argumentliste er spesifisert, skjer det ingen deduksjon.
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 et objekt opprettes med et enkelt argument som samsvarer med en spesifikk type for en klassetemplate, foretrekker CTAD å bruke denne typen direkte, noe som forenkler instansiering for brukerdefinerte templateklasser. For eksempel kan brukere med en templateklasse som Box instansiere den uten å spesifisere typeargumenter når de gir konstruktørargumenter.
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 gjøre vedlikehold av kode enklere. Hvis de underliggende typene endres, er det mindre kode som må oppdateres, noe som gir færre muligheter for feil.
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 bruk av containere eller innpakninger med spesifikke konstruktører kan CTAD forenkle koden. Anta at du har en egendefinert Matrix- eller Vector-klasse som pakker inn en underliggende datatype. Ved å bruke CTAD her kan du sørge for at typededuksjon skjer automatisk basert på de oppgitte argumentene, noe som forbedrer lesbarhet og fleksibilitet.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår