Re[8]: Классический цикл for больше не нужен
От: Шахтер Интернет  
Дата: 05.07.18 14:26
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, Шахтер, Вы писали:


АШ>>>C++11: https://en.cppreference.com/w/cpp/language/range-for


Ш>>Данный код не легален в С++11. Учи матчасть.


NB>разные типы итераторов?


Да. Разумеется, это можно обойти, но за счёт оверхеда в реализации.
Только в C++17, наконец, можно подобные классы писать только с тривиальным оверхедом.
Вообщем, я попробовал -- мне понравилось. Беру на вооружение.

/* class IndLim<SUInt> */

template <SUIntType SUInt>
class IndLim
 {
   SUInt ind;
   SUInt lim;

  public:

   IndLim(SUInt ind_,SUInt lim_) : ind(ind_),lim(lim_) {}

   explicit IndLim(SUInt lim_) : ind(0),lim(lim_) {}

   // loop

   bool operator != (Meta::Empty) const { return ind<lim; }

   SUInt operator * () const { return ind; }

   void operator ++ () { ind++; }

   // begin()/end()

   IndLim begin() const { return *this; }

   Meta::Empty end() const { return {}; }
 };

/* class ForLoop<Cur> */

template <ForType Cur>
class ForLoop
 {
   Cur cur;

  public:

   explicit ForLoop(const Cur &cur_) : cur(cur_) {}

   template <class ... SS>
   explicit ForLoop(SS && ... ss) : cur( std::forward<SS>(ss)... ) {}

   // loop

   bool operator != (Meta::Empty) const { return +cur; }

   decltype(auto) operator * () const { return *cur; }

   void operator ++ () { ++cur; }

   // begin()/end()

   ForLoop begin() const { return *this; }

   Meta::Empty end() const { return {}; }
 };
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.