交换原始指针和迭代器

Interchanging raw pointers and iterators

本文关键字:迭代器 指针 原始 交换      更新时间:2023-10-16

我想声明并实现一个函数,该函数接受指针或迭代器作为形参。也就是说像

这样的东西
void run_through(const Itr& begin, const Itr& end)
{
  for (Itr it = begin; it != end; ++it)
    std::cout << *it << " ";
}

我希望它可以被迭代器或指针调用。也就是说……

int main(int, char**)
{
  int a[] = {3, 1, 4, 1, 5, 9};
  std::vector<int> A(a, a+6);
  std::set<int> B(a, a+6);
  run_through(a, a+6);
  run_through(A.begin(), A.end());
  run_through(B.begin(), B.end());
  return 0;
}

我想知道的是,如果我可以在没有任何模板参数的情况下声明run_through,并在单独的.cpp文件中实现run_through

我很确定,如果不使用模板,你就无法实现一个接受指针或迭代器的函数。虽然指针和迭代器在本质上实现了相同的概念,但它们并不是一种类型退化为另一种类型,就像C数组退化为指针那样。

因此,干净的解决方案确实是使用单个模板函数,例如在c++ 98中:
template<typename forward_itr>
void run_through(forward_itr begin, forward_itr end)
{
  for (forward_itr it = begin; it != end; ++it)
    std::cout << *it << " ";
}

你可以手动专门化一个函数模板,这是你在一个单独的源文件中实现函数所必须做的,但是我的建议是把整个函数放在一个头文件中,让编译器处理它。现代的编译器和链接器非常擅长处理这种情况,并避免可能的代码重复。

只需使用模板函数,无需在单独的cpp中实现

template <class Itr>
void run_through(Itr&& begin, Itr&& end)
{
  for (Itr it = begin; it != end; ++it)
    std::cout << *it << " ";
}