Metaprogramación de plantillas en C++

Prediga la salida del siguiente programa C++.
 

CPP

#include <iostream>
using namespace std;
 
template<int n> struct funStruct
{
    enum { val = 2*funStruct<n-1>::val };
};
 
template<> struct funStruct<0>
{
    enum { val = 1 };
};
 
int main()
{
    cout << funStruct<8>::val << endl;
    return 0;
}

Producción: 

256

El programa calcula “2 elevado a la potencia 8 (o 2^8)”. De hecho, la estructura funStruct se puede usar para calcular 2^n para cualquier n conocido (o n constante). Lo especial del programa anterior es que el cálculo se realiza en tiempo de compilación . Entonces, es el compilador el que calcula 2^8. Para entender cómo hace esto el compilador, consideremos los siguientes hechos sobre plantillas y enumeraciones:
1) Podemos pasar parámetros que no son de tipo (parámetros que no son tipos de datos) a plantillas de clase/función. 
2) Al igual que otras expresiones const, los valores de las constantes de enumeración se evalúan en tiempo de compilación. 
3) Cuando el compilador ve un nuevo argumento para una plantilla, el compilador crea una nueva instancia de la plantilla.
Echemos un vistazo más de cerca al programa original. Cuando el compilador vefunStruct<8>::val , intenta crear una instancia de funStruct con el parámetro 8, resulta que funStruct<7> también debe crearse como constante de enumeración val debe evaluarse en tiempo de compilación. Para funStruct<7> , el compilador necesita funStruct<6> y así sucesivamente. Finalmente, el compilador usa funStruct<1>::val y finaliza la recursividad del tiempo de compilación. Entonces, al usar plantillas, podemos escribir programas que realicen cálculos en tiempo de compilación, tales programas se denominan metaprogramas de plantilla . La metaprogramación de plantillas es, de hecho, completa de Turing, lo que significa que cualquier cálculo expresable por un programa de computadora puede ser calculado, de alguna forma, por un metaprograma de plantilla. La metaprogramación de plantilla generalmente no se usa en programas prácticos, aunque es un concepto interesante. 
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *