std :: vector及其迭代器作为单个模板typename

时间:2009-09-30 10:32:28

标签: c++ stl iterator

为了获得一个“更容易记住”的界面 索引生成函数std :: distance(a,b),我出现了 想要更好地区分它的论点 (当用于向量的基础时:vec.begin()) 通过向量调用模板化函数 和它的迭代器,如:

std::vector<MyType> vect;
std::vector<MyType>::const_iterator iter;
...
...
size_t id = vectorindex_of(iter, vect);

的理由是永远不要混淆顺序 参数; - )

上述观点的明确表述会 看了......像

 template <typename T>
 inline 
 size_t vectorindex_of( 
          typename std::vector<T>::const_iterator iter, 
          const std::vector<T>& vect ) {

  return std::distance( vect.begin(), iter ); 
 }

......虽然有效,但看起来很尴尬。

我希望让模板机制隐式推断出类型 喜欢(伪代码):

 template <typename T>
 inline 
 size_t vectorindex_of(T::const_iterator iter, const T& vect) {
    return std::distance( vect.begin(), iter ); 
 }

......这不起作用。但为什么呢?

3 个答案:

答案 0 :(得分:8)

修复很简单:在typename之前添加T::const_iterator iter。这是必需的,因为类模板可能是专用的,并且使用typename告诉编译器类型名称应该在T::const_iterator而不是值或什么。

您也可以在不太通用的功能中执行相同操作。

答案 1 :(得分:2)

 template <typename T>
 inline 
 std::size_t vectorindex_of(typename T::const_iterator iter, const T& vect) {
    return std::distance( vect.begin(), iter ); 
 }

应该正常工作(注意typename)。在任何一种情况下都应该推导出模板参数。

答案 2 :(得分:1)

您可能也对获取矢量迭代器索引的“更容易记住”的方式感兴趣:

i - vec.begin()

它与使用随机访问迭代器的指针算法相同!