Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Deducción de Argumentos de Plantilla de Clase | Plantillas de Clases
Templates en C++

Deducción de Argumentos de Plantilla de Clase

Desliza para mostrar el menú

Es posible que ya hayas utilizado algunos de ellos sin darte cuenta de que eran plantillas al principio, posiblemente debido a la deducción de argumentos de plantilla de clase (CTAD).

Con C++17, podemos aprovechar la deducción de argumentos de plantilla de clase (CTAD). Esta característica nos permite crear instancias de nuestras clases plantilla sin especificar explícitamente los tipos de plantilla. En su lugar, el compilador infiere los tipos en función de los parámetros del constructor. Veamos algunos ejemplos usando 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 la única forma de crear una instancia de std::pair. Sin embargo, ahora es posible omitir la parte <int, char>. Intenta eliminarla y ejecuta el código nuevamente.

La deducción de argumentos de plantilla de clase solo se realiza si no hay una lista de argumentos de plantilla presente. Si se especifica una lista de argumentos de plantilla, no se lleva a cabo la deducción.

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

Al crear un objeto con un solo argumento que coincide con un tipo específico de una clase plantilla, CTAD prefiere usar ese tipo directamente, lo que simplifica la instanciación para clases plantilla definidas por el usuario. Por ejemplo, con una clase plantilla como Box, los usuarios pueden instanciarla sin especificar argumentos de tipo al proporcionar argumentos al constructor.

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 puede facilitar el mantenimiento del código. Si los tipos subyacentes cambian, hay menos código que actualizar, lo que reduce las oportunidades de errores.

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>

Al utilizar contenedores o envoltorios con constructores específicos, CTAD puede simplificar el código. Supón que tienes una clase personalizada Matrix o Vector que envuelve un tipo de dato subyacente. Usar CTAD en este caso puede ayudar a asegurar que la deducción de tipos ocurra automáticamente según los argumentos proporcionados, mejorando la legibilidad y flexibilidad.

question mark

¿Qué es la deducción de argumentos de plantilla de clase (CTAD)?

Selecciona la respuesta correcta

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 4

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Sección 3. Capítulo 4
some-alt