首页 > 解决方案 > map::const_iterator 映射类型不是 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)?

标签: c++

解决方案


出于几乎所有实际目的,您可能想要推断的类型与某个表达式相关联,在这种情况下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

推荐阅读