#ifndef BOOST_UTILITY_DEMANGLED_TYPE_NAME_HPP #define BOOST_UTILITY_DEMANGLED_TYPE_NAME_HPP #include #include #include #include #if defined(CXX0X_VARIADIC_TEMPLATES) && defined(BOOST_USE_MPL_VARIADIC_TEMPLATES) #include #include #endif namespace utility { inline std::string demangled_type_info ( std::type_info const& a_type_info , std::string a_qual="" ) { ; std::string demangled(compiler::demangled_typeinfo_name(a_type_info)) //Because type_info contains no outermost cv qualifiers, //must append them if they exist: ; demangled+=a_qual ; return demangled ;} template inline std::string demangled_type_name(void) { ; std::type_info const& my_typeinfo(typeid(Type)) ; std::string my_qual(""); ; if(boost::is_const::value) { ; my_qual=" const" ;} ; if(boost::is_volatile::value) { ; my_qual=" volatile" ;} ; return demangled_type_info(my_typeinfo,my_qual) ;} template inline std::string demangled_type_name #if defined(CXX0X_VARIADIC_TEMPLATES) && defined(BOOST_USE_MPL_VARIADIC_TEMPLATES) ( Type&& a_type ) { ; return demangled_type_name::type>() ;} #else ( Type& a_type ) { ; return demangled_type_name() ;} #endif #if defined(CXX0X_VARIADIC_TEMPLATES) && defined(BOOST_USE_MPL_VARIADIC_TEMPLATES) struct demangler { std::string& demangled; unsigned count; demangler(std::string&d) : demangled(d) , count(0) {} ~demangler() { } template void operator()(T) { if(count++) demangled+=", "; demangled+=demangled_type_name(); } }; template inline std::string demangled_type_names() { ; std::string demangled("{ "); ; demangler f(demangled) ; boost::mpl::for_each::type...> >(f) ; demangled+="}\n"; ; return demangled ;} template inline std::string demangled_type_names(Type&&...) { ; return demangled_type_names() ;} #endif }//exit utility namespace #endif