Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

61 řádky
1.3 KiB

  1. #pragma once
  2. #include <memory>
  3. #include "type_helper.h"
  4. namespace cppcore
  5. {
  6. namespace __impl
  7. {
  8. template<typename T>
  9. std::string get_type_name()
  10. {
  11. using ptr_u = std::unique_ptr<char, decltype(&free)>;
  12. int status;
  13. ptr_u name(
  14. abi::__cxa_demangle(typeid(T).name(), 0, 0, &status),
  15. &free);
  16. return std::string(name
  17. ? name.get()
  18. : typeid(T).name());
  19. }
  20. }
  21. template<typename T>
  22. const std::string& type_helper<T>::name()
  23. {
  24. static auto value = __impl::get_type_name<T>();
  25. return value;
  26. }
  27. /**
  28. * @brief Implements a unique counter for the given template parameters.
  29. */
  30. template<typename... T_args>
  31. size_t& unique_counter<T_args...>::next()
  32. {
  33. static size_t value { };
  34. return ++value;
  35. }
  36. /**
  37. * @brief Get a unique ID for the passed template arguments.
  38. *
  39. * @tparam T_counter Counter to use to generate the unique ID.
  40. * @tparam X Type to generate the ID for.
  41. */
  42. template<typename T_counter, typename... X>
  43. size_t get_unique_id()
  44. {
  45. static const auto v = unique_counter<T_counter>::next();
  46. return v;
  47. }
  48. }