Выберите наименьший целочисленный тип, основанный на поплавке

Я пытаюсь написать класс, который включает в себя переменную, тип которой будет выбран как наименьшая возможная возможность содержать значение.

Что я имею в виду:

class foo {
 "int type here" a;
}

Я столкнулся с Автоматически выбираю тип переменной, достаточно большой для хранения указанного номера. Из-за трудностей с использованием библиотеки boost я пошел дальше и использовал предложения шаблонов.

Это превращает код в:

template<unsigned long long T>
class foo {
 SelectInteger<T>::type a;
}

Однако моя проблема возникает из-за того, что размер переменной является результатом умножения переменной с плавающей запятой и целого числа. Поэтому я хотел бы иметь возможность:

template<unsigned long long T, double E>
class foo {
 SelectInteger<T*E>::type a;
}

Но так как шаблоны не работают с переменными с плавающей запятой (см. здесь), я не могу передать E в шаблон. Есть ли другой способ передать переменную (которая должна быть доступна во время компиляции) классу?

Ответы

Ответ 1

Как использовать функцию constexpr?

Я имею в виду... что-то следующее

template <unsigned long long>
struct SelectInteger
 { using type = int; };

template <>
struct SelectInteger<0U>
 { using type = short; };

constexpr unsigned long long getSize (unsigned long long ull, double d)
 { return ull*d; }

template <unsigned long long T>
struct foo
 { typename SelectInteger<T>::type a; };

int main()
 {
   static_assert( std::is_same<short,
                     decltype(foo<getSize(1ULL, 0.0)>::a)>::value, "!");
   static_assert( std::is_same<int,
                     decltype(foo<getSize(1ULL, 1.0)>::a)>::value, "!!");
 }