dune-common  2.2.1
classname.hh
Go to the documentation of this file.
1 #ifndef DUNE_CLASSNAME_HH
2 #define DUNE_CLASSNAME_HH
3 
9 #include <cstdlib>
10 #include <string>
11 #include <typeinfo>
12 
13 #if defined(__GNUC__) && ! defined(__clang__)
14 #include <cxxabi.h>
15 #endif // #ifdef __GNUC__
16 
17 namespace Dune {
18 
20  template <class T>
21  std::string className ( T &t )
22  {
23  std::string className = typeid( t ).name();
24 #if defined(__GNUC__) && ! defined(__clang__)
25  int status;
26  char *demangled = abi::__cxa_demangle( className.c_str(), 0, 0, &status );
27  if( demangled )
28  {
29  className = demangled;
30  std::free( demangled );
31  }
32 #endif // #ifdef __GNUC__
33  return className;
34  }
35 
37  template <class T>
38  std::string className ()
39  {
40  std::string className = typeid( T ).name();
41 #if defined(__GNUC__) && ! defined(__clang__)
42  int status;
43  char *demangled = abi::__cxa_demangle( className.c_str(), 0, 0, &status );
44  if( demangled )
45  {
46  className = demangled;
47  std::free( demangled );
48  }
49 #endif // #ifdef __GNUC__
50  return className;
51  }
52 
53 } // namespace Dune
54 
55 #endif // DUNE_CLASSNAME_HH