es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Entradas de un método dependiendo de la estructura de la plantilla.

template <typename stru_="">
class templateClasse{
public:

    using stru = Stru_;

    static void method_0(int sk, int sl){
        printf("class templateClass method_0 sk: %d sl: %d\n", sk, sl);
    }

    static void method_1(int a){
        if (stru::isvec){
            method_0(0, a);
        } else{
            method_0(a, 0);
        }
    }
};

“`
Me gustaría cambiar los inputs en el método <code>method_0</code> dependiendo del valor de la variable booleana <code>stru::isvec</code>, como muestra el código, mientras tanto, deseo que la elección de la rama <code>if (stru::isvec) else</code> se realice durante la <strong>compilación</strong> en lugar de en tiempo de ejecución. Mis preguntas son:
1. ¿El código elige el método <code>method_0</code> durante la compilación?
2. El código se compila correctamente solo cuando agrego la palabra clave <code>static</code> antes de esos dos métodos. ¿Por qué debería funcionar <code>static</code> en este caso? Normalmente, entiendo <code>static</code> de la siguiente manera:

<blockquote>
Estas variables estáticas se almacenan en un área de almacenamiento estático, no en la pila.
</blockquote>

Y sé que cuando uso <code>static const int tmp = 50;</code> este <code>tmp</code> se calcula en tiempo de compilación. ¿Entonces se puede entender <code>static</code> aproximadamente como una palabra clave para ayudar en el cálculo en tiempo de compilación?

<ol>
<li>¿Tenemos otras soluciones en este caso?</li>
</ol>

¡Gracias de antemano!
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai
    1. Sí, el código elige el método_0 durante la compilación porque la sentencia if-else se basa en un parámetro de plantilla (stru::isvec) que se resuelve durante la compilación.
    2. La palabra clave static en este caso se refiere a una función miembro estática, lo que significa que no requiere una instancia de la clase para ser llamada. No tiene ninguna relación con el especificador de duración de almacenamiento static para variables. Sin embargo, en general, static puede ser utilizado para ayudar en cálculos en tiempo de compilación, especialmente cuando se utiliza con variables constexpr.

    3. Otra solución para lograr ramificación en tiempo de compilación sería usar std::conditional en lugar de la sentencia if-else. Aquí hay un ejemplo:

    template <typename stru_="">
    class templateClasse{
    public:
      using stru = Stru_;
    
      static void method_0(int sk, int sl){
        printf("class templateClass method_0 sk: %d sl: %d\n", sk, sl);
      }
    
      static void method_1(int a){
        typename std::conditional<stru::isvec, std::true_type,="" std::false_type="">::type{};
        method_0(stru::isvec ? 0 : a, stru::isvec ? a : 0);
      }
    };
    

    En este código actualizado, se utiliza std::conditional para elegir entre std::true_type y std::false_type basándose en el valor de stru::isvec. El tipo resultante se instancia como un objeto anónimo (utilizando llaves), que es una construcción en tiempo de compilación que solo existe durante la compilación y no afecta el rendimiento en tiempo de ejecución. Por último, el valor de stru::isvec se utiliza para elegir los argumentos de method_0 utilizando el operador ternario ? y :.</stru::isvec,>

Comments are closed.