Tengo un código como
template <size_t N>
class A
{
template <size_t N>
someFunctions() {};
};
Ahora quiero crear instancias de la clase y llamar a las funciones en un bucle for para un conjunto de muchos valores como
// in main()
int main()
{
for (int i = 1; i <= 100; i++)
{
const int N = i; // dont know how to do this
A<N> a;
a.functionCalls();
}
}
¿Como hacer esto? Esperando un método para hacer esto.
c++
for-loop
templates
compile-time-constant
template-classes
nachiappan venkatesh
fuente
fuente
N
debe serconstexpr
cuál si es una variable de bucle ese no es el casoRespuestas:
Esto requeriría algo llamado a,
template for
que es la declaración de expansión de formulario esperada que tomarán las , que es algo que parece un bucle for, pero en realidad es un bloque con plantilla en una función que se instancia varias veces.Por supuesto, hay una solución alternativa. Podemos abusar de lambdas genéricas para declarar algún tipo de bloque local con plantilla e instanciarlo nosotros mismos:
Esta función toma una secuencia de enteros e instancia la lambda
F
tantas veces como la longitud de la secuencia.Se usa así:
Aquí,
N
se puede enviar como parámetro de plantilla porque es un objeto que tiene un operador de conversión constexpr a un tipo entero. Más precisamente, esstd::integral_constant
un valor creciente.Ejemplo en vivo
fuente
static_cast<void>
?f
devuelve un tipo que sobrecarga al operador de comatemplate for
. Abusar de construcciones de lenguaje como esta siempre es más dolorosoLa
N
necesidad de ser constante en tiempo de compilación, que es con unfor
bucle normal, no es posible.Pero, hay muchas soluciones alternativas. Por ejemplo, inspirado en esta publicación SO , puede hacer algo como lo siguiente. ( Ver una demostración en vivo )
Imprime
1
a100
En c ++ 17 , lo anterior se puede reducir a una sola
AGenerator
clase de plantilla (es decir, se puede evitar la especialización), utilizandoif constexpr
. ( Ver una demostración en vivo )Salida :
En caso de proporcionar el rango de iteración, puede usar lo siguiente. ( Ver una demostración en vivo )
Produce lo mismo que la versión anterior.
fuente
Desde C ++ 20, puede usar plantillas lambdas, por lo que puede probar algo de la siguiente manera
El siguiente es un ejemplo completo de compilación que imprime todos los números del 0 al 99
fuente
Una forma de hacerlo es con una metaprogramación de plantilla con algo como esto:
fuente
Solo para completar: ¿es realmente necesario que la clase o la función tengan una plantilla, si el único uso de la función se llama desde el bucle?
Si es así y no quieres escribir a mano, mira boost.hana.
fuente