class Iterator {
public:
    using iterator_category = std::forward_iterator_tag;
    using value_type = T;
    using reference = T&;
    using pointer = T*; // Not strictly required, but nice to have.
    using difference_type = int;

    reference operator*() const;
    Iterator& operator++();
    Iterator operator++(int)
    {
        auto copy { *this };
        ++(*this);
        return copy;
    }
    // This one isn't strictly required, but it's nice to have.
    pointer operator->() const { return &(operator*()); }

    friend bool operator==(const Iterator& lhs, const Iterator& rhs) {... };
    friend bool operator!=(const Iterator& lhs, const Iterator& rhs) { return !(lhs == rhs); }
};