traits.hpp 528 B

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