Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Dedução de Argumentos de Template de Classe | Templates de Classe
Templates em C++

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

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

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

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

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

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>

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.

question mark

O que é Dedução de Argumentos de Template de Classe (CTAD)?

Selecione a resposta correta

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 4

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 3. Capítulo 4
some-alt