c++ - map::const_iterator 映射类型不是 const
问题描述
我正在尝试为构建在地图之上的类编写一个迭代器适配器。尝试从迭代器类型获取映射类型时遇到问题。基本上我想得到:
- map<Key,Val>::iterator --> Val
- map<Key,Val>::const_iterator --> Val const
这是一个最小的复制。
#include <map>
#include <type_traits>
template <typename BaseIteratorT>
using ValueType = typename BaseIteratorT::value_type::second_type;
// Passes
static_assert(
std::is_same<ValueType<std::map<double, int>::iterator>, int>::value,
"bad type for mutable iterator");
// Fails
static_assert(
std::is_same<ValueType<std::map<double, int>::const_iterator>, const int>::value,
"bad type for const iterator");
我怎样才能做到这一点(C++ 14)?
解决方案
出于几乎所有实际目的,您可能想要推断的类型与某个表达式相关联,在这种情况下decltype
始终是答案
template<typename T>
using mapped_type = std::remove_reference_t<decltype((std::declval<T>()->second))>;
using m = std::map<char, int>;
using i = mapped_type<m::iterator> // int
using ci = mapped_type<m::const_iterator> // const int
推荐阅读
- mysql - sql:列索引 19 上的扫描错误,名称“L2Name”:不支持扫描,存储驱动程序。值类型
输入 *string - arrays - 如何将 for 循环中的数据存储到数组中?
- html - Angular 2+:输入装饰器不反映复选框
- datetime - Dart/Flutter 如何比较两个 TimeOfDay 时间?
- javascript - parseFloat 在动画中加倍操作数
- c# - Task.Run(M1Async)与 M1Async()?
- django - Django:必需 = False 无法正常工作
- octave - 在八度的for循环中一个接一个地执行所有案例
- javascript - 什么是 websockets,我应该使用什么 js 框架
- python - 在服务之间传播 JWT 令牌