我的一个重载函数中有一个模板参数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;
});
答案 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
来引用迭代器的值类型。由于模板特化,这将适用于自定义迭代器和指针。因此,对于某些InIter
,T*
为const T*
或T
,您将获得正确的值类型。
自定义迭代器直接定义value_type
成员类型,但是在编写可以处理任何类型迭代器的代码时,使用InIter::value_type
引用迭代器的值类型是不安全的,因为InIter
可能只是一个指针,它没有value_type
成员类型。