traits.hpp 592 B

12345678910111213141516171819202122232425
  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. #define REQUIRES(...) typename = std::enable_if_t<__VA_ARGS__>
  10. namespace types {
  11. template <typename Base, typename = void> struct underlying_type {
  12. using type = Base const &;
  13. };
  14. template <typename Base>
  15. struct underlying_type<Base, std::void_t<typename Base::underlying_type>> {
  16. using type = typename Base::underlying_type;
  17. };
  18. template <typename Base>
  19. using underlying_type_t = typename underlying_type<Base>::type;
  20. }