Klassmallargumentdeduktion
Svep för att visa menyn
Du kanske redan har använt några av dem utan att inse att de var mallar från början, möjligen tack vare Class Template Argument Deduction (CTAD).
Med C++17 kan vi dra nytta av Class Template Argument Deduction (CTAD). Denna funktion gör det möjligt att skapa instanser av våra mallklasser utan att explicit ange malltyperna. Istället härleder kompilatorn typerna baserat på konstruktorns parametrar. Låt oss titta på några exempel 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; }
Tidigare var detta det enda sättet att skapa en instans av std::pair. Nu är det dock möjligt att utelämna <int, char>. Prova att ta bort det och kör koden igen.
Argumentdeduktion för klasstemplat utförs endast om ingen lista med templatargument anges. Om en templatargumentlista specificeras sker ingen deduktion.
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 ett objekt skapas med ett enda argument som matchar en specifik typ av en klasstemplate, föredrar CTAD att använda den typen direkt, vilket förenklar instansieringen för användardefinierade templateklasser. Till exempel, med en templateklass som Box, kan användare instansiera den utan att ange typargument när konstruktionsargument ges.
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öra kodunderhåll enklare. Om underliggande typer ändras behöver mindre kod uppdateras, vilket leder till färre möjligheter till fel.
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>
Vid användning av containrar eller omslagare med specifika konstruktorer kan CTAD förenkla koden. Anta att du har en egen Matrix- eller Vector-klass som omsluter en underliggande datatyp. Att använda CTAD här kan hjälpa till att säkerställa att typdeduktion sker automatiskt baserat på de argument som ges, vilket förbättrar läsbarhet och flexibilitet.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal