Stavo leggendo le risposte a "Printing 1 to 1000 without loop or conditionals" e mi chiedo perché è necessario avere il caso speciale per NumberGeneration < 1> nella risposta superiore.Ricompilazione e condizionali del tempo di compilazione
Se rimuovo e aggiungo un controllo per N == 1 nel modello (codice di seguito), la compilazione del codice non riesce con "profondità di istanziazione modello supera il massimo", ma non sono sicuro del perché. I condizionali sono gestiti diversamente in fase di compilazione?
#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);
}
Grazie, questo ha senso, non stavo davvero pensando all'istanziazione in fase di compilazione ed era aspettandosi che venga fatto solo quando viene raggiunto il codice. –
@ baris.m: Ma c'è una sottigliezza cruciale di ciò che intendi con "il codice viene raggiunto": viene raggiunto una volta durante la compilazione dal compilatore, sempre, e quindi di nuovo * condizionalmente * in fase di esecuzione durante l'esecuzione del programma. –
Nel mio commento stavo parlando di essere raggiunto in fase di esecuzione. La tua risposta ha perfettamente senso. –