simplified traits using std::void_t

This commit is contained in:
Mike Zozu 2020-12-15 20:01:26 +03:00
parent b025166e4c
commit 69c2cada35

View File

@ -53,34 +53,28 @@ namespace argparse {
namespace details { // namespace for helper methods namespace details { // namespace for helper methods
template <typename... Ts> struct is_container_helper {}; template <typename T, typename = void>
template <typename T, typename _ = void>
struct is_container : std::false_type {}; struct is_container : std::false_type {};
template <> struct is_container<std::string> : std::false_type {}; template <> struct is_container<std::string> : std::false_type {};
template <typename T> template <typename T>
struct is_container< struct is_container<T, std::void_t<typename T::value_type,
T, decltype(std::declval<T>().begin()),
std::conditional_t<false, decltype(std::declval<T>().end()),
is_container_helper<typename T::value_type, decltype(std::declval<T>().size())>>
decltype(std::declval<T>().begin()), : std::true_type {};
decltype(std::declval<T>().end()),
decltype(std::declval<T>().size())>,
void>> : std::true_type {};
template <typename T> template <typename T>
static constexpr bool is_container_v = is_container<T>::value; static constexpr bool is_container_v = is_container<T>::value;
template <typename T, typename _ = void> template <typename T, typename = void>
struct is_streamable : std::false_type {}; struct is_streamable : std::false_type {};
template <typename T> template <typename T>
struct is_streamable< struct is_streamable<
T, std::conditional_t< T, std::void_t<decltype(std::declval<std::ostream>() << std::declval<T>())>>
false, decltype(std::declval<std::ostream>() << std::declval<T>()), : std::true_type {};
void>> : std::true_type {};
template <typename T> template <typename T>
static constexpr bool is_streamable_v = is_streamable<T>::value; static constexpr bool is_streamable_v = is_streamable<T>::value;