Улучшение факториальной функции шаблонаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Улучшение факториальной функции шаблона

Сообщение Anonymous »

Я начал обучать шаблоны в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»