【发布时间】:2015-12-21 11:11:01
【问题描述】:
在为“迭代器”范围编写通用函数时,我通常会这样做:
template <typename Iter> auto func(Iter &first, Iter &last)
{
using IterType = typename std::decay<decltype(*first)>::type;
...
}
另一种方式似乎是:
template <typename Iter> auto func(Iter &first, Iter &last)
{
using IterType = typename std::iterator_traits<Iter>::value_type;
...
}
还有第三个:
template <typename Iter> auto func(Iter &first, Iter &last)
{
using IterType = typename Iter::value_type;
...
}
没有申请iterator_traits。
理论上,我的函数应该只接收 first 和 last 的迭代器,而第二种形式理想地(恕我直言)是获取类型的最惯用方式。但是使用typename std::decay<decltype(*first)>::type 是为了不对Iter 施加限制,就像定义value_type 一样吗?
【问题讨论】:
-
我认为按值传递迭代器是惯用的。
-
如果
iterator_traits对某事不起作用,则表示某事不是迭代器。