如何用C++20 Concepts检查自定义迭代器实现的完整性
自定义迭代器合规性验证与C++20 Concept的应用
我实现了如下自定义容器类型:
#define ARR_SIZE 20 class IntegersCollection { public: class Iterator { public: using iterator_category = std::forward_iterator_tag; using difference_type = std::ptrdiff_t; using value_type = int; using pointer = value_type *; using reference = value_type &; Iterator(pointer ptr) : m_ptr(ptr) {} reference operator*() const { return *m_ptr; } pointer operator->() { return m_ptr; } Iterator &operator++() { m_ptr++; return *this; } Iterator operator++(int) { Iterator tmp = *this; ++(*this); return tmp; } friend bool operator==(const Iterator &a, const Iterator &b) { return a.m_ptr == b.m_ptr; }; friend bool operator!=(const Iterator &a, const Iterator &b) { return a.m_ptr != b.m_ptr; }; private: pointer m_ptr; }; Iterator begin() { return Iterator(&m_data[0]); } Iterator end() { return Iterator(&m_data[ARR_SIZE]); } private: int m_data[ARR_SIZE]; };
但我不确定是否已经实现了一个完整合规的迭代器所需的全部成员方法与字段。
C++20引入了Concept特性,也存在random_access_iterator这类迭代器相关的concept。我想知道有没有类似下面示例中is_shape这样的迭代器concept,能明确规定特定类型迭代器(比如前向迭代器)应具备的成员方法与字段:
template <typename T> concept is_shape = requires(T v) { { v.area() } -> std::floating_point; }; class Circle { private: double r; public: Circle(double r) { this->r = r; } double area() { return r * r * std::numbers::pi_v<float>;; }; }; template <is_shape T> float getVolume(T &shape, float height) { return shape.area() * height; } Circle my_circle(3); std::cout << getVolume(my_circle, 7.2) << "\n";
这样的话,如果我遗漏了某些方法或字段,C++能立即报错,而不是等到用户使用这个迭代器的时候才发现问题。
内容的提问来源于stack exchange,提问作者D.J. Elkind
相关产品推荐
相关产品推荐

