
Antony Polukhin wrote:
Would be there some interest in function for getting class name without RTTI?
Boost.Exception has such a function boost::type_name in <boost/exception/detail/type_info.hpp>. Personally, I'm using the following code. This code is useful because it does not strip off cv- or ref-qualifiers (e.g. boost::type_name<int const&>() --> "int const&"). #include <string> #include <boost/config.hpp> #ifndef BOOST_NO_TYPEID #include <boost/units/detail/utility.hpp> #else #include <boost/current_function.hpp> #endif namespace boost { namespace type_name_detail { #ifndef BOOST_NO_TYPEID template <typename T> struct demangle_impl { static std::string apply() { return boost::units::detail::demangle(typeid(T).name()); } }; template <typename T> struct demangle_impl<T const> { static std::string apply() { return demangle_impl<T>::apply() + " const"; } }; template <typename T> struct demangle_impl<T volatile> { static std::string apply() { return demangle_impl<T>::apply() + " volatile"; } }; template <typename T> struct demangle_impl<T const volatile> { static std::string apply() { return demangle_impl<T>::apply() + " const volatile"; } }; template <typename T> struct demangle_impl<T&> { static std::string apply() { return demangle_impl<T>::apply() + "&"; } }; #ifndef BOOST_NO_RVALUE_REFERENCES template <typename T> struct demangle_impl<T&&> { static std::string apply() { return demangle_impl<T>::apply() + "&&"; } }; #endif #endif } // namespace type_name_detail template <typename T> inline std::string type_name() { #ifndef BOOST_NO_TYPEID return type_name_detail::demangle_impl<T>::apply(); #else return BOOST_CURRENT_FUNCTION; #endif } } // namespace boost Regards, Michel