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

时间:2015-12-15 23:01:45

标签: c++ c++11 generics types

我想写一个如下所述的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;
}

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

1 个答案:

答案 0 :(得分:4)

假设你有所需的重载std::ostream operators,你可以让实际的迭代器成为你的功能模板的类型

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;
}