Я пишу небольшой арифметический класс с фиксированной точкой с параметрами шаблона для целых и дробных битов. При умножении двух небольших типов фиксированных точек результат должен быть более крупным фиксированным типом, чтобы фиксировать полный результат. Например. умножение двух чисел 8.8 с фиксированной точкой приводит к числу фиксированных точек 16.16.Как написать шаблон, приводящий к примитивному типу?
Мой класс выглядит следующим образом:
template<typename T, unsigned int bits, unsigned int frac>
class FixedPoint {
public:
constexpr FixedPoint(int x = 0) : raw_(x << frac) { }
constexpr FixedPoint(double x) : raw_(x * (T(1) << frac)) { }
private:
T raw_;
}
Теперь проблема является параметром шаблона T, особенно для умножения, как тип результата отличается от типов аргументов и не может быть infered. Письмо a * b не работает.
То, что я хотел бы сделать, это заменить T с типом шаблона Int < бит + гидроразрыва > что является int8_t, int16_t, int32_t или int64_t в зависимости от количества битов общей требуемой.
Как написать такой тип? Я в порядке, ограничивая его ровно 8, 16, 32 или 64 бит.
Почему вы подвергаете пользователя 'T' пользователю? Разве это не скрытая деталь реализации? Разве они не могут видеть только «бит» и «фрак»? –
Да, они должны. Я просто не знал, как правильно выбрать тип для T. Это в основном вопрос. –