2015-07-20 3 views
0

Есть ли какой-либо признак, указывающий, является ли контейнер «несколькими» или «неупорядоченными»?Контейнерные черты - is_multi, is_ordered, is_associative

например.

is_multi<std::multiset<Foo>>::value_type //true 
is_multi<std::set<Foo>>::value_type //false 
is_ordered<std::map<Foo, Bar>>::value_type //true 
... 

Это довольно легко написать их (так как есть очень мало контейнеров в УВО), но мой вопрос, есть ли такой вызов (или ЬурейеЕ в контейнере) является СТЛ

почему?

Я пишу некоторые общие алгоритмы, которые работают по разному на «мульти» контейнер (например, в начале, когда найденное значение) или «заказать» контейнеры ...

+0

_ «Это довольно легко написать их (так как есть очень мало контейнеров в СТЛ)» _ Это довольно много, ваш ответ прямо там. –

ответ

1

Я надеялся, что есть некоторые различия знака для «мульти "и" неупорядоченных "контейнеров. Например, как и все ассоциативные контейнеры, содержит key_type член typedef. Это позволяет писать такие черты, как:

template<typename T> 
struct to_void 
{ 
    typedef void type; 
}; 

template <typename Container, typename dummy = void> 
struct is_associative_container : std::false_type {}; 

template <typename Container> 
struct is_associative_container 
<Container, typename to_void<typename Container::key_type>::type > : std::true_type{}; 

Я ничего не нашел, поэтому я использовал метод перечисления. Так вот контейнер черты:

#include <map> 
#include <set> 
#include <unordered_map> 
#include <unordered_set> 

template<typename T> 
struct to_void 
{ 
    typedef void type; 
}; 

template <typename Container, typename dummy = void> 
struct is_associative_container : std::false_type {}; 

template <typename Container> 
struct is_associative_container<Container, typename to_void<typename Container::key_type>::type > : std::true_type{}; 

template <typename Container> 
struct is_multi_container : std::false_type {}; 

template <typename Container> 
struct is_unique_container : std::conditional<is_multi_container<Container>::value, std::false_type, std::true_type>::type{}; 

template <typename Container> 
struct is_unordered_container : std::false_type {}; 

template <typename Container> 
struct is_ordered_container : std::conditional<is_unordered_container<Container>::value, std::false_type, std::true_type>::type{}; 

template <typename T, typename Compare, typename Alloc> 
struct is_multi_container<std::multiset<T,Compare, Alloc>> : std::true_type {}; 

template <typename T, typename Compare, typename Alloc> 
struct is_multi_container<std::multimap<T, Compare, Alloc>> : std::true_type{}; 

template <typename T, typename Hash, typename Pred, typename Alloc> 
struct is_multi_container<std::unordered_multimap<T, Hash, Pred, Alloc>> : std::true_type{}; 

template <typename T, typename Hash, typename Pred, typename Alloc> 
struct is_multi_container<std::unordered_multiset<T, Hash, Pred, Alloc>> : std::true_type{}; 

template <typename T, typename Hash, typename Pred, typename Alloc> 
struct is_unordered_container<std::unordered_multimap<T, Hash, Pred, Alloc>> : std::true_type{}; 

template <typename T, typename Hash, typename Pred, typename Alloc> 
struct is_unordered_container<std::unordered_map<T, Hash, Pred, Alloc>> : std::true_type{}; 

template <typename T, typename Hash, typename Pred, typename Alloc> 
struct is_unordered_container<std::unordered_multiset<T, Hash, Pred, Alloc>> : std::true_type{}; 

template <typename T, typename Hash, typename Pred, typename Alloc> 
struct is_unordered_container<std::unordered_set<T, Hash, Pred, Alloc>> : std::true_type{}; 
+0

, конечно, он бы немного отличался при использовании псевдонимов шаблонов, но мой компилятор их не поддерживает – relaxxx

Смежные вопросы