Как адаптировать вызываемый итератор для цикла for на основе диапазона без предварительного чтения следующего элементаC++

Программы на C++. Форум разработчиков
Anonymous
Как адаптировать вызываемый итератор для цикла for на основе диапазона без предварительного чтения следующего элемента

Сообщение Anonymous »

У меня есть вызываемый итератор, то есть экземпляр std::function, который вызывается повторно, пока не вернет std::nullopt. Все возвращаемые значения легко собрать в std::vector, но я ищу какой-то адаптер, чтобы использовать его в (чистом) цикле for:
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]

Вернуться в «C++»