From 209644c17783bc25b64b090d958e57b8929a18e6 Mon Sep 17 00:00:00 2001 From: Alexander Nasonov Date: Sat, 20 Jan 2007 13:16:40 +0000 Subject: [PATCH] Better fix for SF:1358600 [SVN r36762] --- include/boost/detail/lcast_precision.hpp | 45 +++++++++++------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/include/boost/detail/lcast_precision.hpp b/include/boost/detail/lcast_precision.hpp index 9b785cd..5bd96fd 100644 --- a/include/boost/detail/lcast_precision.hpp +++ b/include/boost/detail/lcast_precision.hpp @@ -15,7 +15,9 @@ #include #include -#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) // VC++ 8.0 +#ifndef BOOST_NO_IS_ABSTRACT +// Fix for SF:1358600 - lexical_cast & pure virtual functions & VC 8 STL +#include #include #endif @@ -27,26 +29,7 @@ namespace boost { namespace detail { -#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) - -template struct lcast_msvc_limits; - -template -struct lcast_msvc_limits - : std::numeric_limits -{ -}; - -// Non-abstract class that does define a specialization of numeric_limits: -class lcast_msvc_without_limits {}; - -template -struct lcast_msvc_limits - : std::numeric_limits -{ -}; - -#endif // VC++ workaround +class lcast_abstract_stub {}; #ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS // Calculate an argument to pass to std::ios_base::precision from @@ -55,10 +38,14 @@ struct lcast_msvc_limits template struct lcast_precision { -#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) - typedef lcast_msvc_limits::value)> limits; +#ifdef BOOST_NO_IS_ABSTRACT + typedef std::numeric_limits limits; // No fix for SF:1358600. #else - typedef std::numeric_limits limits; + typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_< + boost::is_abstract + , std::numeric_limits + , std::numeric_limits + >::type limits; #endif BOOST_STATIC_CONSTANT(bool, use_default_precision = @@ -109,7 +96,15 @@ inline std::streamsize lcast_get_precision(T* = 0) return lcast_precision::value; #else // Follow lcast_precision algorithm at run-time: - typedef std::numeric_limits limits; +#ifdef BOOST_NO_IS_ABSTRACT + typedef std::numeric_limits limits; // No fix for SF:1358600. +#else + typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_< + boost::is_abstract + , std::numeric_limits + , std::numeric_limits + >::type limits; +#endif bool const use_default_precision = !limits::is_specialized || limits::is_exact;