Я читал ответы на "Printing 1 to 1000 without loop or conditionals", и мне интересно, зачем нужен специальный чехол для NumberGeneration < 1> в верхнем ответе.Рекурсия и условные условия компиляции
Если я удалю это и добавлю чек для N == 1 в шаблоне (код ниже), код не завершится компиляцией, «глубина создания экземпляра превышает максимум», но я не уверен, почему. Условны обрабатываются по-разному во время компиляции?
#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);
}
Спасибо, это имеет смысл, я действительно не думал о создании экземпляра компиляции и был ожидая, что это будет сделано только при достижении кода. –
@ baris.m: Но есть критическая тонкость того, что вы подразумеваете под «код достигнут»: он достигается один раз во время компиляции, всегда, а затем снова * условно * во время выполнения во время выполнения программы. –
В моем комментарии я говорил о том, чтобы быть достигнутым во время выполнения. Ваш ответ имеет смысл. –