fork download
  1. #include <type_traits>
  2. #include <typeinfo>
  3. #include <cxxabi.h>
  4. #include <memory>
  5. #include <string>
  6. #include <cstdlib>
  7. #include <iostream>
  8.  
  9. template <class T>
  10. std::string
  11. type_name()
  12. {
  13. typedef typename std::remove_reference<T>::type TR;
  14. std::unique_ptr<char, void(*)(void*)> own
  15. (
  16. abi::__cxa_demangle(typeid(TR).name(), nullptr,
  17. nullptr, nullptr),
  18. std::free
  19. );
  20. std::string r = own != nullptr ? own.get() : typeid(TR).name();
  21. if (std::is_const<TR>::value)
  22. r += " const";
  23. if (std::is_volatile<TR>::value)
  24. r += " volatile";
  25. if (std::is_lvalue_reference<T>::value)
  26. r += "&";
  27. else if (std::is_rvalue_reference<T>::value)
  28. r += "&&";
  29. return r;
  30. }
  31.  
  32.  
  33.  
  34. int
  35. main()
  36. {
  37. char* pointer[] = {"hallo"};
  38. char **p = pointer; // SeppJ weiss alles
  39. std::cout << "decltype(pointer) is " << type_name<decltype(pointer)>() << '\n';
  40. std::cout << "decltype(p) is " << type_name<decltype(p)>() << '\n';
  41. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
decltype(pointer) is char* [1]
decltype(p) is char**