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
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 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
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
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
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>
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.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla