我的一个重载函数中有一个模板参数InIter,我需要调用for_each_nInIter循环进行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/

10-11 22:48
查看更多