如何编写一个可以迭代泛型类型的函数

How do I write a function that can iterate over a generic type

本文关键字:迭代 泛型类型 函数 一个 何编写      更新时间:2023-10-16

我想写一个类似下面描述的print_all的函数。

#include <iterator>
#include <vector>
template <typename V>
void print_all(std::iterator<std::input_iterator_tag, V> it) {
  for (; it != std::end(it); ++it) {
    V item = *it;
    // do stuff with item
  }
}
int main() {
  std::vector<int> myvec (10);
  print_all(myvec.cbegin());
  return 0;
}

如何声明print_all,使其可以接受类型为V的任何迭代器?

编辑

我想以一种类型安全的方式来做这件事。用例的一个更好的例子是累加器

#include <iterator>
#include <vector>
#include <functional>
template <typename V, typename K>
K accumulate(
      std::function<K(K, V)> accumulator,
      std::iterator<std::input_iterator_tag, V> it,
      std::iterator<std::input_iterator_tag, V> end,
      K initial) {
  K sum = initial;
  for (; it != end; ++it) {
    V item = *it;
    sum = accumulator(sum, item);
  }
  return sum;
}

现在你明白了为什么这个问题不是这个问题的重复。我觉得有一种类型安全的方法可以做到这一点,编译器确保迭代器迭代正确的类型。这就是为什么我不愿意接受Steve Lorimer的回答。

假设您有所需的重载std::ostream运算符,您可以将实际的迭代器作为您的函数模板的类型

template<typename IterT>
void print_all(IterT begin, IterT end)
{
    while (begin != end)
        std::cout << *begin++ << ", ";
    std::cout << 'n';
}

如前所述,只有当您有必要的std::ostream& operator<<(...)过载时,这才会起作用。

你可以这样称呼它:

int main()
{
    std::vector<int> myvec;
    // populate myvec...
    print_all(std::begin(myvec), std::end(myvec));
    return 0;
}