Первый требовался, когда функции constexpr еще не было. Перечисления были единственным способом сохранить значения, используемые во время компиляции, когда constexpr
не существовало. В настоящее время вы можете реализовать те же вычисления на основе шаблонов, используя static constexpr
вместо перечислений. Кроме того, первый тип не является c по типу, он предназначен только для int
.
Второй тип c по типу использует шаблон, но выполняется только во время выполнения.
Из Конечно, шаблоны создаются во время компиляции, но созданный код является исполняемым только по умолчанию.
С помощью функции constexpr
вы можете написать один и тот же код для времени выполнения и времени компиляции:
template <typename T>
constexpr T factorial(T n)
{
T x{};
if (n == 1)
return 1;
x = n * factorial(n-1);
return x;
}
int main() {
int compiletime[factorial(2)];
int n;
std::cin >> n;
int runtime = factorial(n);
}