traits.hpp 616 B

123456789101112131415161718192021222324252627
  1. //
  2. // traits.hpp
  3. // opaque_typedef
  4. //
  5. // Created by Sam Jaffe on 12/1/23.
  6. // Copyright © 2023 Sam Jaffe. All rights reserved.
  7. //
  8. #pragma once
  9. #include <type_traits>
  10. #define REQUIRES(...) typename = std::enable_if_t<__VA_ARGS__>
  11. namespace types {
  12. template <typename Base, typename = void> struct underlying_type {
  13. using type = Base const &;
  14. };
  15. template <typename Base>
  16. struct underlying_type<Base, std::void_t<typename Base::underlying_type>> {
  17. using type = typename Base::underlying_type;
  18. };
  19. template <typename Base>
  20. using underlying_type_t = typename underlying_type<Base>::type;
  21. }