簡體   English   中英

std :: vector及其迭代器作為單個模板typename

[英]std::vector and its iterator as single template typename

為了獲得索引生成函數std :: distance(a,b)的“易於記憶”的接口,我提出了更好地區分它的參數的想法(當使用它的基礎時vector: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 ); 
 }

......哪個不起作用。 但為什么?

修復很簡單:在T::const_iterator iter之前添加typename 這是必需的,因為類模板可能是專用的,並且使用typename告訴編譯器在T::const_iterator一個類型名稱,而不是值或其他東西。

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

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

應該工作正常(注意typename )。 在任何一種情況下都應該推導出模板參數。

您可能還對以“更容易記住”的方式獲取向量迭代器的索引感興趣:

我 - vec.begin()

它與使用隨機訪問迭代器的指針算法完全相同!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM