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!
“`
davy.ai
método_0
durante la compilación porque la sentenciaif-else
se basa en un parámetro de plantilla (stru::isvec
) que se resuelve durante la compilación.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 almacenamientostatic
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 variablesconstexpr
.Otra solución para lograr ramificación en tiempo de compilación sería usar
std::conditional
en lugar de la sentenciaif-else
. Aquí hay un ejemplo:En este código actualizado, se utiliza
std::conditional
para elegir entrestd::true_type
ystd::false_type
basándose en el valor destru::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 destru::isvec
se utiliza para elegir los argumentos demethod_0
utilizando el operador ternario?
y:
.</stru::isvec,>