template <typename Iter, typename C = std::monostate> class SkEnumerate { using Captured = decltype(*std::declval<Iter>()); template <typename> struct is_tuple : std::false_type {}; template <typename... T> struct is_tuple<std::tuple<T...>> : std::true_type {};
// v must be a r-value to bind to temporary non-const references. static constexpr auto MakeResult(size_t i, Captured&& v) { if constexpr (is_tuple<Captured>::value) { return std::tuple_cat(std::tuple<size_t>{i}, v);
} else { // Capture v by reference instead of by value by using std::tie. return std::tuple_cat(std::tuple<size_t>{i}, std::tie(v));
}
}
using Result = decltype(MakeResult(0, std::declval<Captured>()));
class Iterator { public: using value_type = Result; using difference_type = ptrdiff_t; using pointer = value_type*; using reference = value_type; using iterator_category = std::input_iterator_tag;
constexpr Iterator(ptrdiff_t index, Iter it) : fIndex{index}, fIt{it} { }
constexpr Iterator(const Iterator&) = default;
constexpr Iterator operator++() { ++fIndex; ++fIt; return *this; }
constexpr Iterator operator++(int) { Iterator tmp(*this); operator++(); return tmp; }
constexpr booloperator==(const Iterator& rhs) const { return fIt == rhs.fIt; }
constexpr booloperator!=(const Iterator& rhs) const { return fIt != rhs.fIt; }
constexpr reference operator*() { return MakeResult(fIndex, *fIt); }
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.