Рассмотрим следующий код:
template <std::intmax_t Base, std::intmax_t Exponent>
struct integer_power_bounded
{
static_assert(Exponent >= 0,
"Error in 'integer_power_bounded': 'Exponent >= 0' is false");
static constexpr std::intmax_t value = /* something */;
};
template <std::intmax_t Base>
struct integer_power_bounded<Base, 0>
{
static constexpr std::intmax_t value = 1;
};
Вместо /* something */
я хотел бы вернуть std::numeric_limits<std::intmax_t>::min()
или std::numeric_limits<std::intmax_t>::max()
, если Base^Exponent
не может быть представлен std::intmax_t
. Трудно, чтобы избежать переполнения во время вычисления, потому что они создают ошибки при компиляции.
Как это сделать (без повышения)?