在模板<类中,It>函数,其中它是一个迭代器,我可以让它::value_type同时适用于vector::iterators和array::iterators吗?



我一直在编写一些函数,这些函数采用名为It的模板,该模板应该是一个迭代器。然后我用It::value_type来实现一些功能。这对我尝试过的大多数容器都有效,但对std::array失败了。如果我使用std::array,我得到错误

error: ‘long unsigned int*’ is not a class, struct, or union type

所以我看到了问题,std::array的迭代器只是一个指针,这对我来说是有意义的。因此它没有定义::value_type。但是我怎样才能使我的模板代码,使这适用于std::arraystd::vector,std::list等?

我做了一个MWE,其中的函数只是一个愚蠢的病态例子,显示了我的问题

#include <vector>
#include <iostream>
#include <array>
template <class It>
void print_accumulate(It first, It last) {
typename It::value_type result{};    // What do I write here??
while (first != last) {
result += *first;
++first;
}
std::cout << result << "n";
}
int main() {
std::vector<size_t> v = {1, 2, 3, 4, 5}; /* Replacing with std::array<size_t, 5> gives error */
print_accumulate(v.begin(), v.end());
}

上面的工作只是很好,几乎每一个容器我试过,vector,list,set等。然而,当我试图通过用std::array<size_t, 5>替换std::vector<size_t>来运行代码时,我得到了我给出的错误消息。

提前感谢!

使用iterator_traits

template <class It>
void print_accumulate(It first, It last) {
typename std::iterator_traits<It>::value_type result{};    // use iterator_traits
while (first != last) {
result += *first;
++first;
}
std::cout << result << "n";
}

相关内容

  • 没有找到相关文章

最新更新