types.h 1.0 KB

1234567891011121314151617181920212223242526
  1. #pragma once
  2. namespace cli::detail {
  3. template <typename T> struct is_string : std::false_type {};
  4. template <typename T>
  5. struct is_string<T*> : std::is_same<std::remove_cv_t<T>, char> {};
  6. template <typename T>
  7. struct is_string<T[]> : std::is_same<std::remove_cv_t<T>, char> {};
  8. template <typename...Ts>
  9. struct is_string<std::basic_string<Ts...>> : std::true_type {};
  10. template <typename T, typename = void> struct is_container : std::false_type {};
  11. template <typename T>
  12. struct is_container<T, std::enable_if_t<!std::is_void_v<typename T::value_type>>> : std::true_type {};
  13. template <typename T, typename = void> struct is_map_value_type : std::false_type {};
  14. template <typename K, typename V>
  15. struct is_map_value_type<std::pair<K const, V>> : std::true_type {};
  16. template <typename T>
  17. static constexpr bool const is_string_v = is_string<T>::value;
  18. template <typename T>
  19. static constexpr bool const is_container_v = is_container<T>::value;
  20. template <typename T>
  21. static constexpr bool const is_map_value_type_v = is_map_value_type<T>::value;
  22. }