#include <iostream>
#include <limits>
#include <iomanip>

template<class T>
struct accurate_proxy
{
    T value;
};

template<class T>
std::ostream& operator<<(std::ostream& os, accurate_proxy<T> const& x)
{
    std::ios::fmtflags oldflags = os.flags();
    if ((oldflags & std::ios::floatfield)==std::ios::fixed)
        os.setf(std::ios::fmtflags(0),std::ios::floatfield);
    std::streamsize oldpres = os.precision();
    os.precision(std::numeric_limits<T>::digits+3);
    os << x.value;
    os.precision(oldpres);
    os.flags(oldflags);
    return os;
}

template<class T>
accurate_proxy<T> accurate(T const& x)
{
    accurate_proxy<T> result = {x};
    return result;
}

int main()
{
    std::cout << accurate(0.1f) << std::endl;
    std::cout << accurate(0.1) << std::endl;
    std::cout << accurate(0.1L) << std::endl;
    std::cout << 0.1 << std::endl;
}
