【问题标题】:std::vector and its iterator as single template typenamestd::vector 及其迭代器作为单个模板类型名
【发布时间】:2009-09-30 10:32:27
【问题描述】:

为了获得一个“更容易记住”的界面 索引生成函数 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 ); 
 }

...这是行不通的。但是为什么呢?

【问题讨论】:

    标签: c++ stl iterator


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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)。在任何一种情况下都应该推导出模板参数。

      【讨论】:

      • 感谢您指出这个简单的修复方法。我想将您的两个答案都标记为“已接受的答案”,但只有一个是可能的;-)
      【解决方案3】:

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

      i - vec.begin()

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

      【讨论】:

        猜你喜欢
        • 2018-04-27
        • 2014-02-02
        • 2018-07-24
        • 2012-07-01
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        相关资源
        最近更新 更多