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
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; }
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
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
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
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>
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à.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione