Bienvenidos sean a este post, hoy comenzaremos con el primer tipo de argumento para templates.
En este post cuando hablamos de los parametros non-type mencionamos que los tipos a manejar con estos parametros deben ser constantes. Los argumentos de este mismo tipo deben coincidir con alguno de los valores de los parametros. Por esta razon, este tipo de argumentos son usados para la iniciacion de clases o las especificaciones de tamaño de los contenedores de las clases. Este tipo de argumentos pueden contemplar varias reglas de trabajo pero la principal y mas importante es que los argumentos non-type deben ser convertidos en expresiones constantes a los parametros de templates correspondientes. Analicemos el siguiente ejemplo:
#include <iostream>
template <int N>
class V
{
public:
V(int inicio) {
for(int i = 0; i < N; ++i) { a[i] = inicio; }
}
int a[N];
};
int b = 5;
int main()
{
V<b> x(1);
x.a[2] = 10;
for( auto &e : x.a)
std::cout << e << std::endl;
return 0;
}
Este es el codigo que vimos con parametros non-type en este post. Pero nos vas a venir muy bien para ver este tema. En este caso, tenemos un template con un parametro non-type. En la clase usaremos el parametro para establecer el tamaño de la propiedad que tendremos en la misma. En el constructor recibiremos un valor para asignar a cada una de las posiciones del array anteriormente comentado. Luego tenemos una variable con un valor y esta la usaremos para asignar la cantidad de posiciones al momento de crear el objeto de la clase anterior en el main. Una vez creado, modificaremos la tercera posicion del array y luego mostraremos todos los valores. Compilemos y veamos como es la salida:
$ g++ plantilla.cpp -o plantilla
plantilla.cpp: In function ‘int main()’:
plantilla.cpp:17:12: error: the value of ‘b’ is not usable in a constant expression
17 | V<b> x(1);
| ^
plantilla.cpp:13:5: note: ‘int b’ is not const
13 | int b = 5;
| ^
plantilla.cpp:17:12: note: in template argument for type ‘int’
17 | V<b> x(1);
| ^
plantilla.cpp:18:11: error: request for member ‘a’ in ‘x’, which is of non-class type ‘int’
18 | x.a[2] = 10;
| ^
plantilla.cpp:19:26: error: request for member ‘a’ in ‘x’, which is of non-class type ‘int’
19 | for( auto &e : x.a)
| ^
$
En este caso, falla porque como mencionamos al inicio. El argumento debe ser del mismo tipo que el parametro. Y este al ser non.-type solo puede recibir valores de tipo constante. Para solucionarlo debemmos modificar la linea de la variable b de la siguiente manera:
const int b = 5;
Simplemente convertimos esta variable en una constante. El resto del codigo sigue siendo el mismo. Compilemos y veamos como es la salida:
$ ./plantilla
1
1
10
1
1
$
Como pueden ver ahora si funciono nuestro codigo. Como mencionamos anteriormente, si bien podemos aplicar varias reglas para pasar datos del argumento al parametro. El que mas debemos tener en cuenta es que el valor sea de tipo constante. Si encuentro mas informacion sobre como son las distintas reglas que podemos aplicar las subire mas adelante.
En resumen, hoy hemos visto argumento non-type, que es, para que sirve, como se aplica, y un ejemplo para entender un poco mejor el concepto. 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
