Estaba leyendo las respuestas a "Printing 1 to 1000 without loop or conditionals" y me pregunto por qué es necesario tener el caso especial para NumberGeneration < 1> en la respuesta superior.Recopilación de tiempo de compilación y condicionales
Si elimino eso y agrego un cheque para N == 1 en la plantilla (código debajo), el código falla la compilación con "la profundidad de la instanciación de la plantilla excede el máximo" pero no estoy seguro por qué. ¿Los condicionales se manejan de manera diferente en tiempo de compilación?
#include <iostream>
template<int N>
struct NumberGeneration
{
static void out(std::ostream& os)
{
if (N == 1)
{
os << 1 << std::endl;
}
else
{
NumberGeneration<N-1>::out(os);
os << N << std::endl;
}
}
};
int main()
{
NumberGeneration<1000>::out(std::cout);
}
Gracias, esto tiene sentido, realmente no estaba pensando en la creación de instancias en tiempo de compilación y esperando que solo se haga cuando se alcanza el código. –
@ baris.m: Pero hay una sutileza crucial de lo que quiere decir con "se alcanza el código": se alcanza una vez durante la compilación por el compilador, siempre, y luego de nuevo * condicionalmente * en tiempo de ejecución durante la ejecución del programa. –
En mi comentario estaba hablando de ser contactado en tiempo de ejecución. Tu respuesta tiene perfecto sentido. –