将迭代器作为参数传递

时间:2019-03-05 01:26:49

标签: c++ templates iterator

我正在尝试编写一个可以接受任何迭代器作为参数的模板函数。

例如,我应该能够通过此函数传递所有类型的数组,列表,向量。

我正在考虑编写如下函数:

[{'email': 'austin1@gmail.com', 'lat': 30.3, 'long': -97.67, 'nearby_users': []},
{'email': 'austin2@gmail.com', 'lat': 30.2, 'long': -97.73, 'nearby_users': ['austin1@gmail.com']},
{'email': 'austin3@gmail.com', 'lat': 30.26, 'long': -97.74, 'nearby_users': ['austin1@gmail.com', 'austin2@gmail.com']},
{'email': 'palm_beach@gmail.com', 'lat': 26.62, 'long': -80.05, 'nearby_users': []}]

其中T1应该是容器类型,而T2应该是算术类型。

理想情况下,我想使用此函数传递数组和向量。

任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:0)

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

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

另一方面,您的模板除了将参数传递给std::distance外什么也不做,因此它似乎并没有真正增加任何价值。直接使用std::distance可能会更好。

答案 1 :(得分:0)

这是一个好主意,但容易失败-例如,考虑vector具有一个Allocator模板参数,该参数默认为默认值,并且您很少指定自己,但始终存在。因此,您最简单的用例已经比预期的要复杂得多,谁知道其他容器可能会带来什么惊喜呢?

取而代之的是直接采用迭代器类型。如果函数中的代码可与迭代器一起使用,那就太好了。如果没有,它将无法编译(或您的用户违反了记录的前提条件)。如果它可以与您不亲自称为“迭代器”的东西一起使用,那么,这有关系吗?可行!

template <typename Iterator>
auto proof(const Iterator& it1, const Iterator& it2)
{
   return std::distance(it1, it2);
}

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