通过迭代器c ++确定变量类型

时间:2017-06-29 13:41:08

标签: c++ templates iterator size typetraits

我有一些泛型函数正在返回<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); 
  ... 
  ...

}

2 个答案:

答案 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);