2009-09-30 115 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(

這等同於指針運算隨機訪問迭代器!