map和multimap之间的C ++模板特化

时间:2017-06-27 10:53:42

标签: c++ c++11 templates metaprogramming

在这里阅读其他主题我已经编写了代码检测类是否是关联容器[1]。现在为了使用equal_range,我需要检测它是普通的map还是multimap。有什么方法可以实现我的目标吗?

3 个答案:

答案 0 :(得分:3)

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

template<typename>
struct is_map : std::false_type {};

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

WANDBOX示例

答案 1 :(得分:0)

您还可以使用the suggestions in this post根据at()operator[]

的存在进行专门化

答案 2 :(得分:0)

原始答案非常适合检查类型是否为地图。但是,它不适用于测试类型是否从映射继承。我尝试了一个通用解决方案,最后想到了以下代码:

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);

is_map函数有2个重载。一个匹配地图的指针,另一个匹配其他所有东西。因为它们使用指针,所以也可以传递通过map公开派生的东西的地址。

只有T不可能是地图时,is_map(const void *)才会匹配。