Advertisement
alansam

Type demangling.

Mar 31st, 2022 (edited)
1,143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. // Works with g++ & and clang++. Needs C++14 minimum (-std=c++14)
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <string>
  5. #include <typeinfo>
  6. #include <cxxabi.h>
  7.  
  8. using namespace std::literals::string_literals;
  9.  
  10. template <class T>
  11. std::string type_name() {
  12.   typedef typename std::remove_reference<T>::type TR;
  13.   std::unique_ptr<char, void(*)(void *)> own (
  14.     abi::__cxa_demangle(typeid(TR).name(),
  15.                         nullptr,
  16.                         nullptr,
  17.                         nullptr),
  18.     std::free);
  19.   std::string r_ = own != nullptr ? own.get() : typeid(TR).name();
  20.   if (std::is_const<TR>::value) { r_ += " const"s; }
  21.   if (std::is_volatile<TR>::value) { r_ += " volatile"s; }
  22.   if (std::is_lvalue_reference<T>::value) { r_ += "&"s; }
  23.   else if (std::is_rvalue_reference<T>::value) { r_ += "&&"s; }
  24.   return r_;
  25. }
  26.  
  27. template <typename T>
  28. auto tostring = [](T ti) {
  29.   auto out = std::string(typeid(ti).name()) + " - "s + type_name<decltype(ti)>();
  30.   return out;
  31. };
  32.  
  33. struct schain {
  34.   schain * next;
  35.   schain * last;
  36.   char data[128];
  37. };
  38.  
  39. int main() {
  40.   auto greeting = "Hello World!\n"s;
  41.   std::cout << greeting;
  42.   auto searchfor = "Wo"s;
  43.   auto pos = greeting.find(searchfor);
  44.   std::cout << "pos: "s << pos << '\n';
  45.   std::cout << "pos: "s << tostring<decltype(pos)>(pos) << '\n';
  46.   std::cout << std::endl;
  47.  
  48.   auto volatile vole = 123LL;
  49.   std::cout << "vole: "s << vole << '\n';
  50.   std::cout << "vole: "s << tostring<decltype(vole)>(vole) << '\n';
  51.   std::cout << std::endl;
  52.  
  53.   schain chainhome { nullptr, nullptr, '\0', };
  54.   size_t constexpr chainhome_sz = sizeof(chainhome);
  55.   std::cout << "struct schain: "s << chainhome.next << ' ' << chainhome.last << ' ' << std::quoted(chainhome.data) << '\n';
  56.   std::cout << "struct schain: "s << tostring<decltype(chainhome)>(chainhome) << '\n';
  57.   std::cout << std::endl;
  58.   std::cout << "chainhome_sz: "s << chainhome_sz << '\n';
  59.   std::cout << "chainhome_sz: "s << tostring<decltype(chainhome_sz)>(chainhome_sz) << '\n';
  60.   std::cout << std::endl;
  61. }
  62.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement