交换原始指针和迭代器

时间:2014-03-20 22:13:45

标签: c++ templates

我想声明并实现一个以指针或迭代器作为参数的函数。这就是说

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,并在单独的run_through文件中实施.cpp

2 个答案:

答案 0 :(得分:1)

我很确定你不能使用指针或迭代器来实现一个不使用模板的函数。虽然指针和迭代器本质上是实现相同的概念,但它们不是一种类型,其中一种降级为另一种类型,如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 << " ";
}

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

答案 1 :(得分:0)

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

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