Index: basic_text_oprimitive.hpp =================================================================== --- basic_text_oprimitive.hpp (revision 85776) +++ basic_text_oprimitive.hpp (working copy) @@ -84,12 +84,32 @@ // default saving of primitives. template + void stream_maybe_float(const T &t, const mpl::true_&){ + // Type appears to report that it is a floating point type: + std::ios_base::fmtflags f = os.flags(); + std::streamsize p = os.precision(); + os << std::setprecision(std::numeric_limits::digits10 + 2) << std::scientific << t; + os.flags(f); + os.precision(p); + } + template + void stream_maybe_float(const T &t, const mpl::false_&){ + os << t; + } + template void save(const T &t){ if(os.fail()) boost::serialization::throw_exception( archive_exception(archive_exception::output_stream_error) ); - os << t; + typedef mpl::bool_< + is_floating_point::value + || (std::numeric_limits::is_specialized && + !std::numeric_limits::is_integer && + !std::numeric_limits::is_exact && + std::numeric_limits::max_exponent) + > tag_type; + stream_maybe_float(t, tag_type()); } ///////////////////////////////////////////////////////// @@ -123,26 +143,6 @@ save(static_cast(t)); } #endif - void save(const float t) - { - // must be a user mistake - can't serialize un-initialized data - if(os.fail()) - boost::serialization::throw_exception( - archive_exception(archive_exception::output_stream_error) - ); - os << std::setprecision(std::numeric_limits::digits10 + 2); - os << t; - } - void save(const double t) - { - // must be a user mistake - can't serialize un-initialized data - if(os.fail()) - boost::serialization::throw_exception( - archive_exception(archive_exception::output_stream_error) - ); - os << std::setprecision(std::numeric_limits::digits10 + 2); - os << t; - } BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) basic_text_oprimitive(OStream & os, bool no_codecvt); BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())