2017-01-08 4 views
1

Я блуждал, каково новое требование для контейнера, определенного пользователем, для использования с Range-v3 (алгоритмы ...)?Требование к пользовательским контейнерам для соответствия диапазону-v3

Например, что нам нужно изменить в нашем дизайне (типы членов, функция-член ...) в стандартном смысле? Как подчиняться концепциям алгоритмов Range-v3? какие функции-члены нам нужно предоставить? каковы изменения для итераторов?

Что такое замена итераторов/начало/конец?

template<typname T> 
struct container 
{ 
    //... 
    using value_type = T; 
    //... 
    using iterator = value_type*; 
    using const_iterator = const value_type*; 
    //... 
    iterator begin() { //... } 
    //... 
}; 

будет здорово, если кто-то может дать каноническую реализацию контейнера.

Каковы новые идеи/понятия, внесенные Range-v3? каков новый способ кодирования на C++?

+0

Единственный способ ответить на это, чтобы сформулировать требования уже прописанные _very clearly_ в 'range_concepts. hpp'. Итак, просто посмотрите в 'range_concepts.hpp' ... – ildjarn

ответ

1

Насколько я могу судить о диапазоне, просто нужно иметь begin и end членов, которые возвращают действительный итератор. Итератору может быть немного сложнее получить право. Насколько я могу судить, самый слабый итератор (то есть тот, который нуждается в наименее членов) необходимы следующие элементы:

  1. конструктор по умолчанию
  2. конструктор копирования
  3. operator =
  4. operator ++ (как в пред и почтовые формы)
  5. operator *
  6. operator ==
  7. operator !=
  8. Публично наследуется от подходящего экземпляра std::iterator, поэтому он имеет подходящие члены типа - хотя это не рекомендуется в C++ 17, поэтому вы можете вместо этого добавлять типы вручную.

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

static_assert(ranges::Iterator<my_iterator>(), "Not Iterator"); 
Смежные вопросы