| 1976 | }; |
| 1977 | |
| 1978 | struct has_begin_end_impl { |
| 1979 | template <typename T, typename U = unqualified_t<T>, typename B = decltype(std::declval<U&>().begin()), |
| 1980 | typename E = decltype(std::declval<U&>().end())> |
| 1981 | static std::true_type test(int); |
| 1982 | |
| 1983 | template <typename...> |
| 1984 | static std::false_type test(...); |
| 1985 | }; |
| 1986 | |
| 1987 | struct has_key_type_impl { |
| 1988 | template <typename T, typename U = unqualified_t<T>, typename V = typename U::key_type> |