容器是“多”还是“无序”,有什么特征吗?
例如:
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中的容器很少),但我的问题是,是否有这样的调用(或容器中的某个类型定义)是stl
为什么?
我正在写一些通用的算法,它们在“多”容器上的工作方式不同(例如,当找到值时的早期)或“有序”容器上的工作方式不同。
发布于 2015-07-21 15:00:59
我希望有一些区分“多”和“无序”容器的标志。例如,像所有的关联容器一样,它包含key_type成员类型定义。它允许编写如下特征:
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{};https://stackoverflow.com/questions/31518418
复制相似问题