我有一些泛型函数正在返回<T>
类型的变量。我将2个迭代器传递给函数。然后,我尝试使用函数distance
计算向量的大小。在func中我定义了一个名为v_size
的新类型定义,但是向量的<T>
类型是未知的。如何通过仅传递迭代器来计算向量的大小?
template<class In, class T>
T my_func(In b, In e)
{
typedef typename vector<T>::size_type v_size;
v_size size = distance(b, e);
...
...
}
答案 0 :(得分:2)
如果要获取迭代器指向的类型,可以使用std::iterator_traits。 e.g。
template<class In>
auto my_func(In b, In e) -> typename std::iterator_traits<In>::value_type
{
using T = typename std::iterator_traits<In>::value_type;
...
}
BTW:我删除了第二个模板参数T
,它只出现在返回类型声明中,然后无法自动推导出来。否则,您必须在调用函数时明确指定它。
答案 1 :(得分:1)
你可以做3件事:
通过迭代器的operator*()
减去类型:
using v_size = vector<std::remove_reference<decltype(*b)>::type>::size_type;
或使用距离函数的返回类型减去类型:
using v_size = std::decltype(distance(b, e));
或者更好的是,完全删除v_size并让编译器扣除类型:auto size = std::distance(b, e);