Bienvenidos sean a este post, hoy veremos un tema mas de los argumentos de template.
Al igual que sucede con las funciones, al momento de establecer los argumentos de los templates podemos establecer un valor predeterminado. Donde en caso de no informarlo, lo tomara para asignarlo. Para entender este concepto, vamos a aplicarlo en un ejemplo:
#include <iostream>
#include <typeinfo>
template<class T, class U = int> class X;
template<class T = float, class U> class X;
template<class T, class U> class X;
template<class T, class U>
class X
{
public:
T a;
U b;
};
int main()
{
X<int> x1;
X<float> x2;
X<> x3;
X<double, char> x4;
std::cout << typeid(x1.a).name() << ", ";
std::cout << typeid(x1.b).name() << std::endl;
std::cout << typeid(x2.a).name() << ", ";
std::cout << typeid(x1.b).name() << std::endl;
std::cout << typeid(x3.a).name() << ", ";
std::cout << typeid(x3.b).name() << std::endl;
std::cout << typeid(x4.a).name() << ", ";
std::cout << typeid(x4.b).name() << std::endl;
return 0;
}
Importamos la libreria typeinfo porque de esta usaremos a la funcion typeid. Observen que tenemos la sobrecarga de nuestro template y la clase. Pero en esta establecemos valores predeterminados para los dos primeros templates, uno en cada clase, y la tercera la dejamos sin ningun valor predeterminado. En el cuarto template definimos a la clase y en esta tendremos dos propiedades de las clases recibidas en el template. En el main, crearemos cuatro objetos. En los primeros dos, pasaremos los tipos que asignamos como predeterminados anteriormente. El tercer objeto lo pasamos sin ningun tipo y al ultimo si le pasamos dos tipos. Lo siguiente es mostrar el id de cada propiedad de los objetos creados mediante typeid. Compilemos y veamos la salida:
$ ./arg
i, i
f, i
f, i
d, c
$
Vean como es la salida, para el primer y segundo objeto tiene como primer clase la informada y luego para la segunda clase usamos a la predeterminada de tipo int. Pero para el caso del tercer objeto, al no informar ninguno el template le pasara los valores predeterminados. Y en el ultimo caso, al pasar los dos tipos de datos son los que se utilizaron. Como pueden ver, es exactamente igual a como lo utilizamos en las funciones. Donde si existe un valor predeterminado, y no informamos ninguno es el que se procede a utilizar pero si informamos un valor omite al predeterminado y utiliza el recibido.
Pero tenemos ciertas reglas que debemos cumplir para que esto funcione correctamente. El orden de las declaraciones si importa. Por ejemplo, en el codigo anterior las primeras declaraciones no las podemos hacer despues de la definicion de la clase X. Asi como tambien, si un argumento tiene un valor predeterminado. Todos los demas deben tener uno, veamos el siguiente caso:
template<class U = char, class V, class W = int> class X { };
Por ejemplo, esto al momento de compilarlo nos devolvera un error. Porque como dijimos anteriormente, no puede existir un argumento sin valor predeterminado si el anterior posee uno. Para solucionarlo, debemos modificarlo de la siguiente manera:
template<class V, class U = char, class W = int> class X { };
Simplemente cambiamos el orden y con esto podremos compilarlo sin ningun inconveniente. Aqui solamente debemos cuidarnos de como declaramos nuestros templates, asi como tambien los predeterminados en los argumentos. Pero como pudimos ver y ya comentamos, es muy similar a los valores predeterminados en funciones.
En resumen, hoy hemos visto a valores predeterminados para argumentos, que es, para que sirve, como se aplica, y una serie de ejemplos para poder verlo en accion. Espero les haya resultado de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donatión
It’s for site maintenance, thanks!
$1.50
