Накидал тут на коленке код для вывода вещественных чисел с фиксированной запятой в привычном виде. Вышло как-то слишком просто. Имеет право на жизнь?
#include <iostream>
template<typename T, unsigned N>
class Q {
T value;
public:
Q(T value): value(value) {}
T integral() const { return value >> N; }
T fractional() const { return value & (1 << N - 1); }
};
template<unsigned Position, unsigned Multiplier = 5>
struct FractToString {
static unsigned value(unsigned value, unsigned acc = 0) {
auto d = (value >> (Position - 1) & 1) * Multiplier;
return FractToString<Position - 1, Multiplier * 5>::value(value, acc * 10 + d);
}
};
template<unsigned Multiplier>
struct FractToString<0, Multiplier> {
static unsigned value(unsigned value, unsigned acc) {
return acc;
}
};
template<typename T, unsigned N>
std::ostream& operator<< (std::ostream& os, const Q<T, N>& q)
{
return os << static_cast<int>(q.integral()) << "." << static_cast<int>(FractToString<N>::value(q.fractional()));
}
int main(int argc, char *argv[]) {
std::cout << Q<uint8_t, 3>(0b101101) << std::endl;
}