cplusplus.hpp 827 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #pragma once
  2. #ifdef __cplusplus
  3. namespace types::traits::inner {
  4. template <typename Tp, typename>
  5. struct remove_pointer {
  6. using type = Tp;
  7. };
  8. template <typename Tp, typename T>
  9. struct remove_pointer<Tp, T*> {
  10. using type = T;
  11. };
  12. template <typename Tr, typename>
  13. struct remove_reference {
  14. using type = Tr;
  15. };
  16. template <typename Tr, typename T>
  17. struct remove_reference<Tr, T&> {
  18. using type = T;
  19. };
  20. } // namespace types::traits::inner
  21. namespace types::traits {
  22. template <typename Tp>
  23. struct remove_pointer
  24. : inner::remove_pointer<Tp, Tp> {
  25. };
  26. template <typename Tr>
  27. struct remove_reference
  28. : inner::remove_reference<Tr, Tr> {
  29. };
  30. template <typename T>
  31. struct add_pointer {
  32. using type = T*;
  33. };
  34. template <typename T>
  35. struct add_reference {
  36. using type = T&;
  37. };
  38. } // namespace types
  39. #endif