Здравствуйте, 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 {}; }
};