Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Deduzione degli argomenti del template di classe | Template di Classe
Template C++

Deduzione degli argomenti del template di classe

Scorri per mostrare il menu

Potresti averne già utilizzati alcuni senza renderti conto che fossero template, forse grazie alla Deduzione degli Argomenti dei Template di Classe (CTAD).

Con C++17, è possibile sfruttare la Deduzione degli Argomenti dei Template di Classe (CTAD). Questa funzionalità consente di creare istanze delle classi template senza specificare esplicitamente i tipi dei template. Il compilatore deduce invece i tipi in base ai parametri del costruttore. Vediamo alcuni esempi utilizzando 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
Nota

In precedenza, questo era l'unico modo per creare un'istanza di std::pair. Tuttavia, ora è possibile omettere la parte <int, char>. Prova a rimuoverla ed esegui nuovamente il codice.

La deduzione degli argomenti dei template di classe viene eseguita solo se non è presente una lista di argomenti template. Se viene specificata una lista di argomenti template, la deduzione non avviene.

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

Quando si crea un oggetto con un singolo argomento che corrisponde a un tipo specifico di un template di classe, CTAD preferisce utilizzare direttamente quel tipo, semplificando l'istanza per le classi template definite dall'utente. Ad esempio, con una classe template come Box, è possibile istanziarla senza specificare gli argomenti di tipo quando si forniscono gli argomenti al costruttore.

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 può rendere la manutenzione del codice più semplice. Se i tipi sottostanti cambiano, c'è meno codice da aggiornare, riducendo così le possibilità di errori.

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>

Quando si utilizzano contenitori o wrapper con costruttori specifici, CTAD può semplificare il codice. Supponiamo di avere una classe personalizzata Matrix o Vector che incapsula un tipo di dato sottostante. Utilizzare CTAD in questo caso può aiutare a garantire che la deduzione del tipo avvenga automaticamente in base agli argomenti forniti, migliorando leggibilità e flessibilità.

question mark

Che cos'è la Deduzione degli Argomenti dei Template di Classe (CTAD)?

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 4

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 3. Capitolo 4
some-alt