查找迭代器的值类型

时间:2014-06-13 14:46:10

标签: c++ c++11 iterator lambda

我的一个重载函数中有一个模板参数InIter,我需要调用for_each_n循环InIter进行x迭代,我不知道没问题。但是我无法获得迭代器的值类型,举个例子:

//invalid lambda function
for_each_n(param1, param2, param3,
    [val](InIter it) {
        *it = val;
    });

然而这不起作用,我需要传入InIter的值类型而不是整个迭代器。这个示例在下面工作,但显然我不能保留std::size_t类型,或者我只能强制创建std::size_t个容器。

for_each_n(param1, param2, param3,
    [val](std::size_t& v){
        v = val;
    });

2 个答案:

答案 0 :(得分:6)

怎么做..

要获取迭代器的值类型,您应该使用std::iterator_traits中的<iterator>,这样可以很容易地获得包装的 value_type ,以及足够通用,以便您甚至可以使用指针

std::iterator_traits<InIter>::value_type
std::iterator_traits<char       *>::value_type                     => char
std::iterator_traits<char const *>::value_type                     => char const
std::iterator_traits<std::vector<int>::iterator      >::value_type => int
std::iterator_traits<std::vector<int>::const_iterator>::value_type => int const

替代

如果您正在编写 C ++ 11 并且具有InIter的实例,那么还可以使用decltype来获取{{1}的类型有效地(在大多数情况下/所有情况下)与*it产生的效果相同。


实施

从你的示例片段来看,似乎你不是想要迭代器的 value_type ,而是对实际的 reference-type 更感兴趣,下面是一个示例实现:

std::iterator_traits<T>::value
for_each_n(param1, param2, param3,
  [val](typename std::iterator_traits<InIter>::reference v){
    v = val;
  }
);

答案 1 :(得分:5)

使用std::iterator_traits。您可以使用std::iterator_traits<InIter>::value_type来引用迭代器的值类型。由于模板特化,这将适用于自定义迭代器和指针。因此,对于某些InIterT*const T*T,您将获得正确的值类型。

自定义迭代器直接定义value_type成员类型,但是在编写可以处理任何类型迭代器的代码时,使用InIter::value_type引用迭代器的值类型是不安全的,因为InIter可能只是一个指针,它没有value_type成员类型。