Как использовать концепцию C++20 для проверки завершения реализации моего собственного итератораC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как использовать концепцию C++20 для проверки завершения реализации моего собственного итератора

Сообщение Anonymous »

Предположим, я хочу реализовать свой собственный тип коллекции, как показано ниже:

Код: Выделить всё

#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, и есть несколько итераторов. - связанные с этим понятия, подобные этому. Я думаю:
Существует ли что-то вроде «концепции итератора», которая четко определяет, какие методы/поля-члены должен иметь конкретный тип итератора (скажем, прямой итератор)? Я представляю себе что-то вроде ниже:

Код: Выделить всё

template 
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; };
};

template  float getVolume(T &shape, float height) {
return shape.area() * height;
}

Circle my_circle(3);
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79029518/how-to-use-c20s-concept-to-check-my-custom-iterator-implementation-is-complet[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»