MAP和Multimap之间的C 模板专业化

C++ template specialization between map and multimap

本文关键字:专业化 Multimap 之间 MAP      更新时间:2023-10-16

在这里阅读其他主题,我已经编写了代码检测类是关联容器[1]。现在,要使用均等_range,我需要检测它是正常地图还是多映射。有什么办法可以实现自己的目标?

  • [1]在类似地图和矢量的容器之间进行歧义模板专业

您可能会添加自己的类型特征:

template<typename>
struct is_map : std::false_type {};
template<typename K, typename V>
struct is_map<std::map<K, V>> : std::true_type {};

wandbox 示例

您还可以根据at()operator[]

的存在来使用本文中的建议来专业化。

原始答案非常适合检查类型是否是地图。但是,如果类型从地图继承,它不适用于测试。我在一般解决方案上进行了各种尝试,最后提出了以下代码:

namespace details {
    constexpr bool is_map(const void*) {
        return false;
    }
    template<typename K, typename V, typename Comp, typename Alloc>
    constexpr bool is_map(const std::map<K, V, Comp, Alloc>*) {
        return true;
    }
}
template<typename T>
constexpr bool is_map_v = details::is_map(static_cast<const T*>(nullptr));
using map1 = std::map<int, int>;
static_assert(is_map_v<map1>);
struct MyMap : public std::map<int, int>{};
static_assert(is_map_v<MyMap>);
static_assert(is_map_v<int> == false);

它具有2个用于IS_MAP函数的超载。一个将指针与地图相匹配,另一个与其他所有内容相匹配。因为他们采取指示,所以传递了从地图公开派生的东西的地址也将被接受。

IS_MAP(const void *(仅在t不能成为地图时匹配。