template <typename Lhs, typename Rhs, bool is_promotion_possible = IsIntegerArithmeticSafe<
              typename std::conditional<std::is_signed<Lhs>::value ||
                                            std::is_signed<Rhs>::value,
                                        intmax_t,
                                        uintmax_t>::type,
              typename MaxExponentPromotion<Lhs, Rhs>::type>::value>

struct FastIntegerArithmeticPromotion

Promotes to a type that can represent any possible result of a binary

arithmetic operation with the source types.