MAP和Multimap之间的C 模板专业化
C++ template specialization between map and multimap
在这里阅读其他主题,我已经编写了代码检测类是关联容器[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不能成为地图时匹配。
相关文章:
- 使用std::multimap迭代器创建std::list
- 如何使用默认参数等选择模板专业化
- 模板化建造师专业化
- 类模板的成员功能的定义在单独的TU中完全专业化
- 部分专业化和嵌套模板
- 模板专业化可以进入我的.cpp吗?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 部分专业化和对标准::void_t<>的需求
- std::multimap<std::chrono::milliseconds, T>::rbegin 在 MSVS-13 中指向 end()?
- "专业化不参与超载"
- 特定好友功能专业化
- 是否可以混合使用SFINAE和模板专业化?
- C++在使用std::multimap时出现运行时错误的几率很小
- 为什么在班级专业化上会出现错误?
- 用 C++20 的给定键读取/写入 std::multimap 的所有值?
- std::multimap::erase() 在迭代时
- enable_if如何帮助选择类模板的专业化?
- std::initializer_list可以专业化吗?
- 派生类中纯虚拟基方法的专业化
- MAP和Multimap之间的C 模板专业化