"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué no se pueden utilizar variables no constantes como argumentos de plantilla en C++?

¿Por qué no se pueden utilizar variables no constantes como argumentos de plantilla en C++?

Publicado el 2025-01-12
Navegar:270

Why Can\'t Non-Constant Variables Be Used as Template Arguments in C  ?

¿Por qué no se puede pasar una variable no constante como argumento de plantilla?

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.

Lograr el objetivo sin modificar la API

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();
}

Llamar a Modify con un valor dinámico

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.

Último tutorial Más>

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