diff --git a/include/boost/core/type_name.hpp b/include/boost/core/type_name.hpp index 8f1df5f..8d0add8 100644 --- a/include/boost/core/type_name.hpp +++ b/include/boost/core/type_name.hpp @@ -37,6 +37,38 @@ template struct tn_identity typedef T type; }; +// tn_enable_if + +template struct tn_enable_if +{ +}; + +template struct tn_enable_if +{ + typedef T type; +}; + +// tn_is_reference + +template struct tn_is_reference +{ + static const bool value = false; +}; + +template struct tn_is_reference +{ + static const bool value = true; +}; + +#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) + +template struct tn_is_reference +{ + static const bool value = true; +}; + +#endif + // typeid_name template std::string typeid_name() @@ -148,6 +180,8 @@ template std::string type_name( tn_identity ) // cv +#if !defined(BOOST_MSVC) || BOOST_MSVC >= 1900 + template std::string type_name( tn_identity ) { return type_name( tn_identity() ) + " const"; @@ -163,13 +197,51 @@ template std::string type_name( tn_identity ) return type_name( tn_identity() ) + " const volatile"; } +#else + +template +typename tn_enable_if::value, std::string>::type +type_name( tn_identity ) +{ + return type_name( tn_identity() ) + " const"; +} + +template +typename tn_enable_if::value, std::string>::type +type_name( tn_identity ) +{ + return type_name( tn_identity() ) + " volatile"; +} + +template +typename tn_enable_if::value, std::string>::type +type_name( tn_identity ) +{ + return type_name( tn_identity() ) + " const volatile"; +} + +#endif + // refs +#if !defined(BOOST_MSVC) || BOOST_MSVC >= 1900 + template std::string type_name( tn_identity ) { return type_name( tn_identity() ) + "&"; } +#else + +template +typename tn_enable_if::value, std::string>::type +type_name( tn_identity ) +{ + return type_name( tn_identity() ) + "&"; +} + +#endif + #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template std::string type_name( tn_identity ) @@ -367,6 +439,20 @@ template class L, class... T> std::string type_name( tn_ident return tn + '<' + st + '>'; } +#else + +template class L, class T1> std::string type_name( tn_identity< L > ) +{ + std::string tn = class_template_name< L >(); + return tn + '<' + type_name( tn_identity() ) + '>'; +} + +template class L, class T1, class T2> std::string type_name( tn_identity< L > ) +{ + std::string tn = class_template_name< L >(); + return tn + '<' + type_name( tn_identity() ) + ", " + type_name( tn_identity() ) + '>'; +} + #endif // sequence containers