En C, los argumentos de plantilla deben ser expresiones constantes. Esto significa que sus valores deben conocerse en el momento de la compilación. El compilador no puede evaluar una variable no constante en este contexto.
Considere el código:
template
void modify(){}
Para pasar una variable no constante como argumento de plantilla, podríamos escribir:
for(int i = 0; i ();
}
Sin embargo, esto genera un error porque el compilador no puede determinar el valor de i en el momento de la compilación. El cuerpo del bucle puede ejecutarse varias veces, cambiando el valor de i.
En lugar de pasar una variable no constante directamente, podemos usar la especialización de plantilla para implementar una llamada iterativa:
#include
template
void modify() { std::cout "
void modify() { std::cout "
void modify() {
std::cout " ();
}
int main() {
modify();
}
Para llamar a Modify con un valor que no se conoce en el momento de la compilación, podemos usar una técnica llamada metaprogramación de plantillas. Aquí hay un ejemplo simplificado:
#include
template <:tuple>>
struct TupleSize;
template
struct TupleSize<:tuple>> {
static const int value = sizeof...(Args);
};
template
void callModify(int i) {
if constexpr (i ();
callModify(i 1);
}
}
int main() {
int n = 10;
callModify::value>(0);
}
En este ejemplo, callModify toma un parámetro N que es el tamaño de una tupla que contiene el rango deseado de valores para i. La función utiliza un metaprograma recursivo para generar las llamadas para modificar hasta el tamaño especificado N.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3