我的一个重载函数中有一个模板参数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;
});
最佳答案
怎么做..
要获得迭代器的值类型,您应该使用 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
获取*it
的类型,该类型实际上(在大多数/所有情况下)与std::iterator_traits<T>::value
产生的类型相同。实作
从示例代码片段来看,您似乎对实际的引用类型更感兴趣,而不是想要迭代器的value_type,下面是一个示例实现:
for_each_n(param1, param2, param3,
[val](typename std::iterator_traits<InIter>::reference v){
v = val;
}
);
for_each_n(param1, param2, param3, [val](decltype(*some_it) v){
v = val;
});
关于c++ - 查找迭代器的值类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24208108/