traits.h 884 B

12345678910111213141516171819202122232425262728
  1. #pragma once
  2. #define _val(type) std::declval<type>()
  3. #define exists(expr) void_t<decltype(expr)>
  4. namespace iterator::detail {
  5. template <typename> using void_t = void;
  6. template <typename T, typename = void> struct reference_helper {
  7. using type = decltype(*std::declval<T>());
  8. };
  9. template <typename T>
  10. struct reference_helper<T, void_t<typename T::reference>> {
  11. using type = typename T::reference;
  12. };
  13. template <typename T, typename = void> struct value_type_helper {
  14. using reference = typename reference_helper<T>::type;
  15. using type = std::remove_cv_t<std::remove_reference_t<reference>>;
  16. };
  17. template <typename T>
  18. struct value_type_helper<T, void_t<typename T::value_type>> {
  19. using type = typename T::value_type;
  20. };
  21. template <typename T> using value_type = typename value_type_helper<T>::type;
  22. template <typename T> using reference = typename reference_helper<T>::type;
  23. }