Здравствуйте, rg45, Вы писали:
R>R>template <typename T>
R>auto consider_sorted_range(const T&) -> std::false_type;
R>// For standard containers, the traits must be defined beforehand
R>template <typename K, typename T, typename C, typename A>
R>auto consider_sorted_range(const std::map<K, T, C, A>&) -> std::true_type;
R>template <typename K, typename T, typename C, typename A>
R>auto consider_sorted_range(const std::multimap<K, T, C, A>&) -> std::true_type;
R>template <typename T, typename C, typename A>
R>auto consider_sorted_range(const std::set<T, C, A>&) -> std::true_type;
R>template <typename T, typename C, typename A>
R>auto consider_sorted_range(const std::multiset<T, C, A>&) -> std::true_type;
R>template <typename T>
R>using is_sorted_container = decltype(consider_sorted_range(std::declval<T>()));
R>
можно несколько короче
template <typename, template <typename...> typename>
struct is_instance : std::false_type {};
template <typename T, template <typename...> typename U>
struct is_instance<U<T>, U> : std::true_type {};
template <typename T>
using is_sorted_container = std::bool_constant<is_instance<T, std::set>::value
&& is_instance<T, std::map>::value
&& is_instance<T, std::multi_map>::value
&& is_instance<T, std::multi_set>::value>;