fork(3) download
  1. #include <iostream>
  2. #include <typeinfo>
  3. #include <memory>
  4. #include <cxxabi.h>
  5. #include <string>
  6.  
  7. template <typename T> std::string TypeName(T) {
  8.  
  9. auto name = typeid(T).name();
  10. int status = 0;
  11.  
  12. std::unique_ptr<char, void(*)(void*)> res {
  13. abi::__cxa_demangle(name, NULL, NULL, &status),
  14. std::free
  15. };
  16.  
  17. return ((status == 0) ? res.get() : name);
  18. }
  19.  
  20.  
  21. int main()
  22. {
  23. int i = 0;
  24. float f = 0.f;
  25.  
  26. std::cout << TypeName(i) << '\n'; // int
  27. std::cout << TypeName(f) << '\n'; // float, so far so good
  28.  
  29. std::cout << TypeName(&i) << '\n'; // int *
  30. std::cout << TypeName(&f) << '\n'; // float *, as expected
  31.  
  32. const int ci = 1;
  33. const float cf = 1.f;
  34.  
  35. std::cout << TypeName(ci) << '\n'; // int!
  36. std::cout << TypeName(cf) << '\n'; // float!
  37.  
  38. int &ri = i;
  39. float &rf = f;
  40.  
  41. std::cout << TypeName(ri) << '\n'; // int!
  42. std::cout << TypeName(rf) << '\n'; // float!
  43.  
  44. const int &cri = i;
  45. const float &crf = f;
  46.  
  47. std::cout << TypeName(cri) << '\n'; // int!
  48. std::cout << TypeName(crf) << '\n'; // float!
  49.  
  50. return 0;
  51. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
int
float
int*
float*
int
float
int
float
int
float