c++ - 容器特征 - is_multi、is_ordered、is_associative

标签 c++ typetraits

是否有任何 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/

相关文章:

C++ is_trivially_copyable 检查

c++ - 我们需要 std::as_const() 做什么?

c++ - 为什么 std::is_copy_constructible 不能按预期工作?

c++ - 声明模板成员函数返回类型

c++ - 这是在 C++ 中执行 "with"语句的最佳方法吗?

c++ - reinterpret_cast 到 C++ 中的聚合类型

c++ - 函数和结构与类

c++ - 如何在对话框的客户区包含自定义图标?

c++ - 类模板中的 typedef 引用另一个类模板中的 typedef 的 SFINAE 失败

c++ - 使用 istream_iterator 读取 N 个字符