You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:04:56