Проблема
Я пытаюсь создать тип Precision для строго типизированного интерфейса. Тем не менее, я не могу заставить его оценить во время компиляции. Есть ли что-то, что мне не хватает?
Код
#include <cstdint>
constexpr uint8_t DOUBLE_MAX_PRECISION{ 16 };
constexpr uint8_t FLOAT_MAX_PRECISION { 7 };
template<uint8_t max>
struct BoundType
{
constexpr BoundType(uint8_t value) : value{ value }
{
if(value > max) {
value = max;
}
}
const uint8_t value;
};
template <typename T> struct Precision {};
template<>
struct Precision<double> : public BoundType<DOUBLE_MAX_PRECISION>
{
constexpr Precision(uint8_t value) : BoundType(value) {}
};
template<>
struct Precision<float> : public BoundType<FLOAT_MAX_PRECISION>
{
constexpr Precision(uint8_t value) : BoundType(value) {}
};
Вариант использования
void print(double number, const Precision<double>&& precision)
{
uint8_t prec = precision.value;
//use prec here to print the numbers decimal digits
}
void print(float number, const Precision<float>&& precision)
{
uint8_t prec = precision.value;
//use prec here to print the numbers decimal digits
}
int main()
{
print(10.0, Precision<double>(10));
print(10.0, Precision<float>(5));
return 0;
}
Годовая стрела: https://godbolt.org/z/FRRBtW
Редактировать
После прочтения ваших предложений я пришел к решению, которое оценивает во время компиляции! Я использовал godbolt под x86-64 g cc (транк) с флагом -Os и некоторыми незначительными изменениями кода.
Я делюсь кодом не только для помощи нуждающимся, но и для людей, чтобы изменить и предложить лучшие решения в этой теме.
Годболт ссылка: https://godbolt.org/z/Q8Q3L4