dune-common 2.1.1
classname.hh
Go to the documentation of this file.
00001 #ifndef DUNE_CLASSNAME_HH
00002 #define DUNE_CLASSNAME_HH
00003 
00009 #include <cstdlib>
00010 #include <string>
00011 #include <typeinfo>
00012 
00013 #if defined(__GNUC__) && ! defined(__clang__)
00014 #include <cxxabi.h>
00015 #endif // #ifdef __GNUC__
00016 
00017 namespace Dune {
00018  
00020     template <class T>
00021     std::string className ( T &t )
00022     {
00023         std::string className = typeid( t ).name();
00024 #if defined(__GNUC__) && ! defined(__clang__)
00025         int status;
00026         char *demangled = abi::__cxa_demangle( className.c_str(), 0, 0, &status );
00027         if( demangled )
00028         {
00029           className = demangled;
00030           std::free( demangled );
00031         }
00032 #endif // #ifdef __GNUC__
00033         return className;
00034     };
00035 
00037     template <class T>
00038     std::string className ()
00039     {
00040         std::string className = typeid( T ).name();
00041 #if defined(__GNUC__) && ! defined(__clang__)
00042         int status;
00043         char *demangled = abi::__cxa_demangle( className.c_str(), 0, 0, &status );
00044         if( demangled )
00045         {
00046           className = demangled;
00047           std::free( demangled );
00048         }
00049 #endif // #ifdef __GNUC__
00050         return className;
00051     };
00052     
00053 } // namespace Dune
00054 
00055 #endif  // DUNE_CLASSNAME_HH