https://godbolt.org/z/M3G3qdP39
Код: Выделить всё
#include
#include
#include
#include
std::function callableIterator() {
return [value = 0]() mutable -> std::optional {
if (value == 10) {
return {};
}
return value++;
};
}
template
auto collectCallable(It&& it) {
using T = std::decay_t;
std::vector result;
while (auto e = it()) {
result.push_back(std::move(*e));
}
return result;
}
template
struct CallableIterable {
It it;
using T = std::decay_t;
CallableIterable(It&& it) : it(std::move(it)) {}
struct EndIterator {};
struct Iterator {
CallableIterable& iterable;
std::optional valueHolder;
Iterator(CallableIterable& iterable) : iterable(iterable), valueHolder(iterable.it()) {}
Iterator& operator++() {
valueHolder = iterable.it();
return *this;
}
bool operator!=(EndIterator) { return !!valueHolder;}
T operator*() { return *valueHolder; }
};
Iterator begin() {
return {*this};
}
EndIterator end() {
return {};
}
};
int main() {
for (auto value : collectCallable(callableIterator())) {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79003694/how-to-adapt-a-callable-iterator-for-range-based-for-loop-without-pre-reading-th[/url]