c++中的迭代器类别

iterator categories in c++

本文关键字:迭代器 c++      更新时间:2023-10-16

本网站上有关于迭代器类别的说明:

迭代器的每个类别不是由特定类型定义的,而是由可在其上执行的操作定义的。这个定义意味着任何支持必要操作的类型都可以用作迭代器

是否可以在运行前强制执行(类似于必须实现的java接口)?

任何东西都可以将自己声明为特定类别的迭代器,而无需实现所需的所有方法。

它是如何执行的?非常简单。如果您尝试将此类别与使用特定类别操作符的方法或函数一起使用,则会得到编译错误,因为这些操作符没有定义。编译器强制它。

但是迭代器类别的实际使用恰恰是向后的。模板假定标识自己为特定类别的迭代器完全实现了需求,并使用该迭代器的类别来验证它是哪种类型的迭代器,否则强制编译错误。

例如(就在我的脑海中),假设你希望你的模板函数只用于随机访问迭代器:

template<typename iterator_category> class must_be_random_access_iterator;
template<> class must_be_random_access_iterator<std::random_access_iterator_tag> {
public:
    typedef int or_else;
};

template<typename iter_type> void some_func(iter_type iter)
{
    typedef must_be_random_access_iterator<
         typename std::iterator_traits<iter_type>::iterator_category
    >::or_else or_else;
    // ... more code
}

must_be_random_access_iterator模板专用于std::random_access_iterator_tag类别,否则它是未定义的,因此将其他迭代器类型传递给模板函数将导致编译错误。

另一种不太常见但更复杂的方法是使用专门化或SFINAE来提供依赖于迭代器形参类别的相同模板类或方法的不同实现。