Dedução de Argumentos de Template de Classe
Deslize para mostrar o menu
Você pode já ter usado alguns deles sem perceber que eram templates inicialmente, possivelmente devido à Dedução de Argumentos de Template de Classe (CTAD).
Com o C++17, é possível aproveitar a Dedução de Argumentos de Template de Classe (CTAD). Esse recurso permite criar instâncias de classes template sem especificar explicitamente os tipos dos templates. Em vez disso, o compilador infere os tipos com base nos parâmetros do construtor. Veja alguns exemplos utilizando 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; }
Anteriormente, esta era a única maneira de criar uma instância de std::pair. No entanto, agora é possível omitir a parte <int, char>. Tente removê-la e execute o código novamente.
A dedução de argumentos de template de classe só é realizada se nenhuma lista de argumentos de template estiver presente. Se uma lista de argumentos de template for especificada, a dedução não ocorre.
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; }
Ao criar um objeto com um único argumento que corresponde a um tipo específico de um template de classe, o CTAD prefere usar esse tipo diretamente, simplificando a instanciação para classes template definidas pelo usuário. Por exemplo, com uma classe template como Box, é possível instanciá-la sem especificar argumentos de tipo ao fornecer argumentos para o construtor.
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 pode facilitar a manutenção do código. Se os tipos subjacentes forem alterados, há menos código para atualizar, reduzindo as oportunidades para erros.
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>
Ao utilizar contêineres ou wrappers com construtores específicos, o CTAD pode simplificar o código. Suponha que você tenha uma classe personalizada Matrix ou Vector que encapsula um tipo de dado subjacente. O uso do CTAD nesse contexto pode garantir que a dedução de tipo ocorra automaticamente com base nos argumentos fornecidos, melhorando a legibilidade e a flexibilidade.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo