[英]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)僅適用於隨機訪問迭代器(如vector
和deque
迭代器)。 如何檢查傳遞的迭代器滿足此要求的代碼?
如果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.