C++ 作为参数传递迭代器

C++ 作为参数传递迭代器,c++,templates,iterator,C++,Templates,Iterator,我正在尝试编写一个模板函数,它可以接受任何迭代器作为参数 例如,我应该能够通过这个函数传递所有类型的数组、列表和向量 我想写一个函数如下: enter template<typename T1, T2> int proof(T1<T2>::iterator& it, T1<T2>::iterator& itt){ return distance(it, itt); } 输入模板 int-proof(T1::迭代器和it,T1::迭代器和i

我正在尝试编写一个模板函数,它可以接受任何迭代器作为参数 例如,我应该能够通过这个函数传递所有类型的数组、列表和向量

我想写一个函数如下:
enter template<typename T1, T2>
int proof(T1<T2>::iterator& it, T1<T2>::iterator& itt){

return distance(it, itt);
}

输入模板
int-proof(T1::迭代器和it,T1::迭代器和itt){
返回距离(it、itt);
}
其中T1应为容器类型,T2应为算术类型 理想情况下,我希望使用此函数传递数组和向量
任何帮助都将不胜感激

要编写可以接受任何迭代器的模板,只需接受任何类型:

template<class It>
int proof(const It&, const It&)
模板
int-proof(const-It&,const-It&)

另一方面,模板除了将参数向前传递到
std::distance
,什么也不做,因此它似乎没有真正增加任何值。简单地使用<代码> STD::距离直接。

< P>这是一个好主意,但是容易失败。例如,考虑<代码>向量有一个默认的<代码>分配器< /代码>模板参数,并且很少指定自己,但总是存在。所以您最简单的用例已经比预期的复杂,谁知道其他容器可能会有什么惊喜呢

而是直接采用迭代器类型。如果函数中的代码与迭代器一起工作,那就太好了。如果没有,那么它将无法编译(或者您的用户违反了已记录的先决条件)。如果它与你个人不称之为“迭代器”的东西一起工作,那么,这有关系吗?它起作用了

template <typename Iterator>
auto proof(const Iterator& it1, const Iterator& it2)
{
   return std::distance(it1, it2);
}
模板
自动证明(常量迭代器&it1、常量迭代器&it2)
{
返回标准::距离(it1,it2);
}

当然,我不建议编写这样的函数,除非它做了比委托给
std::distance
更重要的事情;首先,您的返回类型是错误的。

直接使用
std::distance
。如果你想编写自己的算法,那么就从STL代码中汲取灵感。一旦概念实现,这将是一个很好的解决方案