我正在尝试编写一个可以接受任何迭代器作为参数的模板函数。
例如,我应该能够通过此函数传递所有类型的数组,列表,向量。
我正在考虑编写如下函数:
[{'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应该是算术类型。
理想情况下,我想使用此函数传递数组和向量。
任何帮助,将不胜感激。
答案 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
做更多的事情;首先,您的返回类型错误。