Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Klassmallargumentdeduktion | Klasstemplat
C++-Mallar

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

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; }
Note
Observera

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

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

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

vector.h

12345678
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>

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.

question mark

Vad är Class Template Argument Deduction (CTAD)?

Vänligen välj det korrekta svaret

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 4

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 3. Kapitel 4
some-alt