Я начал обучать шаблоны в C ++ и попытался создать факторную функцию, которая, если возможно, будет выполнена во время компиляции.
Расскажите мне, как я могу улучшить свою реализацию.template
concept NumericIntegral =
std::same_as || std::same_as ||
std::same_as || std::same_as ||
std::same_as || std::same_as
|| std::same_as || std::same_as;
< /code>
Функция шаблона без типа для факториального.template
constexpr auto factorial(){
static_assert(NumericIntegral, "Value must be an integral numeric type.");
static_assert(val >= 0, "Factorial is not defined for negative numbers.");
return val * factorial();
}
// Specializations for base cases n = 0
template
constexpr auto factorial() {
return 1;
}
// Specializations for base cases n = 1
template
constexpr auto factorial(){
return 1;
}
< /code>
Перегруженная факториальная функция для оценки времени выполнения Contexpr для численных интегральных типов.
Компилятор выберет время комплекта или время выполнения на основе контекста contexpr: < /p>
template
constexpr T factorial (T val){
if (val < static_cast(0)){
throw std::invalid_argument("Val must be positive");
}
else if (val == 0 || val == 1){
return 1;
}
else{
return val * factorial(val - 1);
}
}
// Перегруженная факториальная функция для типов с плавающей точкой во время выполнения.
// Это использует гамма-функцию для вычисления факториала для неинтемерных значений:
template
T factorial(T val){
if (val < static_cast(0)){
throw std::invalid_argument("Val must be positive");
}
else{
return std::tgamma(val + 1);
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... mprovement