2009-09-30 52 views
3

为了得到一个“易于记忆”的界面 索引生成函数std :: distance(a,b),我想出了 与它的一个更好的区分想法的论据 (针对向量的基本使用时:vec.begin())通过调用模板函数与向量 及其迭代器,像 :std :: vector和它的迭代器作为单个模板类型名称

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); 
} 

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

回答

8

修复很简单:在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)。在任何一种情况下都应该推出模板参数。

+0

感谢您指出这个简单的修复。我想将您的答案都标记为“已接受的答案”,但只有一个可能;-) – 2009-09-30 10:45:27

1

您可能也有兴趣在“更容易记住的”方式来获得一个矢量迭代器的索引:

我 - )vec.begin(

这等同于指针运算随机访问迭代器!