"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 > ¿Cómo puedo lograr una evaluación constante con argumentos de plantilla cuando el argumento no se conoce en el momento de la compilación?

¿Cómo puedo lograr una evaluación constante con argumentos de plantilla cuando el argumento no se conoce en el momento de la compilación?

Publicado el 2024-11-20
Navegar:663

How Can I Achieve Constant Evaluation with Template Arguments When the Argument Is Not Known at Compile Time?

Evaluación constante del argumento de la plantilla

1. ¿Por qué el compilador no puede evaluar 'i' en tiempo de compilación?

La evaluación en tiempo de compilación requiere que se conozca el valor de 'i' antes de que se ejecute el programa. Sin embargo, en el código proporcionado, 'i' es una variable de bucle que cambia durante la ejecución del programa. El compilador no puede determinar el valor de 'i' en el momento de la compilación porque es un valor asignado dinámicamente.

2. ¿Puedo lograr el objetivo sin modificar la interfaz API?

Sí, puede usar la especialización de plantilla para crear una función recursiva que recorra en iteración el rango de argumentos de la plantilla. Por ejemplo, podrías crear una función:

template
void modify_recursive() {
    // Call modify with template argument 'i'
    modify();
    
    // Recursively call modify_recursive with the next template argument
    if (i ();
    }
}

Llamar a 'modify' con un argumento no constante

Para llamar a 'modify' con un valor que no es una constante de tiempo de compilación, puedes usar un técnica llamada metaprogramación de plantillas. Un enfoque es crear una clase de plantilla que tome un objeto de función como argumento y lo invoque con el valor deseado:

template
struct InvokeWithParam {
    InvokeWithParam(F f, int param) : f(f), param(param) {}
    
    void operator()() { f(param); }
    
    F f;
    int param;
};

Luego puede pasar una instancia de InvokeWithParam como argumento de plantilla para modificar:

int var = 5;
modify();

Esto invocará la función de modificación con el valor de var.

Ú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