是否有任何 Trait 可以判断容器是“多”还是“无序”?
例如
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
...
编写它们非常容易(因为STL中的容器很少),但我的问题是是否有这样的调用(或容器中的一些typedef)是STL
为什么?
我正在编写一些通用算法,这些算法在“多”容器(例如,在发现值时尽早发现)或“有序”容器上工作不同......
最佳答案
我希望有一些区分“多”和“无序”容器的标志。例如像所有的 Associative 容器都包含 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{};
关于c++ - 容器特征 - is_multi、is_ordered、is_associative,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31518418/