Guest User

Untitled

a guest
Jun 22nd, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.42 KB | None | 0 0
  1. #include <typeinfo>
  2. #include <iostream>
  3.  
  4. template <template <class...> class T>
  5. auto& template_id()
  6. {
  7. struct id {};
  8. return typeid(id);
  9. }
  10.  
  11. template <template <class...> class T, class... Args>
  12. auto& template_id(T<Args...>*)
  13. {
  14. return template_id<T>();
  15. }
  16.  
  17. template <class T>
  18. auto& template_id()
  19. {
  20. return template_id((T*) nullptr);
  21. }
  22.  
  23. template <template <int...> class T>
  24. auto& template_id()
  25. {
  26. struct id {};
  27. return typeid(id);
  28. }
  29.  
  30. template <template <class, int> class T>
  31. auto& template_id()
  32. {
  33. struct id {};
  34. return typeid(id);
  35. }
  36.  
  37. template <int n>
  38. struct Foo
  39. {
  40. enum { foo = n };
  41. };
  42.  
  43. namespace hello
  44. {
  45. template <class T>
  46. struct Bar
  47. {
  48. enum : T { foo = 20 };
  49. };
  50. }
  51. using namespace hello;
  52.  
  53. template <class T, int n>
  54. struct Qux
  55. {
  56. enum: T { foo = n };
  57. };
  58.  
  59. using int_bar = Bar<int>;
  60.  
  61. int main()
  62. {
  63. auto& foo_ti = template_id<Foo>();
  64. auto& bar_ti = template_id<Bar>();
  65. auto& int_bar_ti = template_id<int_bar>();
  66. auto& int_bar_i = typeid(int_bar);
  67. auto& qux_ti = template_id<Qux>();
  68.  
  69. std::cerr << foo_ti.name() << "\n"; // Z11template_idI3FooERDavE2id
  70. std::cerr << bar_ti.name() << "\n"; // Z11template_idIN5hello3BarEERDavE2id
  71. std::cerr << int_bar_ti.name() << "\n"; // Z11template_idIN5hello3BarEERDavE2id
  72. std::cerr << int_bar_i.name() << "\n"; // N5hello3BarIiEE
  73. std::cerr << qux_ti.name() << "\n"; // Z11template_idI3QuxERDavE2id
  74. }
Add Comment
Please, Sign In to add comment