types.h 753 B

1234567891011121314151617181920
  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>
  14. static constexpr bool const is_string_v = is_string<T>::value;
  15. template <typename T>
  16. static constexpr bool const is_container_v = is_container<T>::value;
  17. }