我一直在编写一些函数,这些函数采用名为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::array
和std::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";
}