我想声明并实现一个以指针或迭代器作为参数的函数。这就是说
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
。
答案 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 << " ";
}