簡體   English   中英

如何檢查傳遞的Iterator是一個隨機訪問迭代器?

[英]How to check that the passed Iterator is a random access iterator?

我有以下代碼,它執行一些迭代器算術:

template<class Iterator>
void Foo(Iterator first, Iterator last) {
  typedef typename Iterator::value_type Value;
  std::vector<Value> vec;
  vec.resize(last - first);
  // ...
}

(last - first)表達式(AFAIK)僅適用於隨機訪問迭代器(如vectordeque迭代器)。 如何檢查傳遞的迭代器滿足此要求的代碼?

如果Iterator是一個隨機訪問迭代器,那么

std::iterator_traits<Iterator>::iterator_category

將是std::random_access_iterator_tag 實現這個的最干凈的方法可能是創建第二個函數模板並讓Foo調用它:

template <typename Iterator>
void FooImpl(Iterator first, Iterator last, std::random_access_iterator_tag) { 
    // ...
}

template <typename Iterator>
void Foo(Iterator first, Iterator last) {
    typedef typename std::iterator_traits<Iterator>::iterator_category category;
    return FooImpl(first, last, category());
}

這樣做的好處是,如果您願意,可以為不同類別的迭代器重載FooImpl

Scott Meyers在一本有效的C ++書籍中討論了這種技術(我不記得哪一本)。

除了標記調度之外,您還可以使用std::is_same_v直接將類別與std::random_access_iterator_tag進行比較:

using category = typename std::iterator_traits<Iterator>::iterator_category;
if constexpr (std::is_same_v<category, std::random_access_iterator_tag>) {
  vec.resize(last - first);
}

這有時會導致更清晰簡潔的代碼,特別是如果實現的一小部分(如保留向量大小)取決於迭代器類別。

暫無
暫無

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

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