如何为自定义C++ Array类实现std::contiguous_iterator迭代器
实现说明
C++20标准库的迭代器概念是基于类型特征自动推导的,不需要你主动做特殊的「标记放置」操作,你只需要为自定义迭代器补全所有std::contiguous_iterator要求的关联类型与运算符,编译器会自动校验该迭代器是否符合对应概念。
你需要给Iterator内部类补充的核心部分语法示例如下:
import <iterator>; import <type_traits>; template<typename T, int SIZE> class Array { public: const T& operator[](int i) const { return mArray[i]; } T& operator[](int i) { return mArray[i]; } private: T mArray[SIZE]; public: struct Iterator { // 必须定义的迭代器关联类型,是概念校验的基础 using iterator_category = std::contiguous_iterator_tag; using value_type = std::remove_cv_t<T>; using difference_type = std::ptrdiff_t; using pointer = T*; using reference = T&; constexpr Iterator(T* ptr) : mPtr(ptr) {} // 核心运算符实现(剩余要求的运算符可自行补全) constexpr reference operator*() const noexcept { return *mPtr; } constexpr pointer operator->() const noexcept { return mPtr; } constexpr Iterator& operator++() noexcept { ++mPtr; return *this; } constexpr Iterator operator++(int) noexcept { auto tmp = *this; ++mPtr; return tmp; } // 其余需要实现的运算符:--、+=、-=、[]、比较运算符、迭代器相减等 // 可选:显式静态校验迭代器是否符合要求,编译期就能直接给出校验结果 static_assert(std::contiguous_iterator<Iterator>); private: T* mPtr; }; Iterator begin() { return Iterator(&mArray[0]); } Iterator end() { return Iterator(&mArray[SIZE]); } // 实际使用时建议同步补充const迭代器实现,此处省略 };
内容的提问来源于stack exchange,提问作者alexpanter
相关产品推荐
相关产品推荐

