admin管理员组文章数量:1433154
Code Link:
I'd like to create a wrapper around a generator to be used in a for-loop:
#include <functional>
#include <iostream>
#include <optional>
// some move-only generator, e.g. it could read some read-once input stream
class Generator {
public:
Generator() {}
Generator(const Generator&) = delete;
Generator(Generator&&) = default;
bool hasMore() { return _value < 5; }
void next() { _value++; }
int value() const { return _value; }
private:
int _value = 0;
};
// wrapper around Generator to make it usable in a for loop
class Iterable {
public:
Iterable(Generator gen) : _gen(std::move(gen)) {}
class EndIterator {};
class Iterator {
public:
Iterator(const Iterator& other) = delete;
Iterator(Generator gen) : _gen(std::move(gen)) {}
bool operator!=(EndIterator other) { return _gen.hasMore(); }
Iterator& operator++() {
_gen.next();
return *this;
}
int operator*() const { return _gen.value(); }
private:
bool _done = false;
int _next;
Generator _gen;
};
Iterator begin() && { return Iterator(std::move(_gen)); }
EndIterator end() { return {}; }
private:
Generator _gen;
};
int main() {
Iterable iterable{Generator{}};
for (auto i : iterable) {
std::cout << i << std::endl;
}
return 0;
}
I made Iterator::begin()
to operator on an rvalue this
because it moves the generator into the Iterator
. However, I get the following error message:
<source>: In function 'int main()':
<source>:55:19: error: passing 'Iterable' as 'this' argument discards qualifiers [-fpermissive]
55 | for (auto i : iterable) {
| ^~~~~~~~
<source>:45:14: note: in call to 'Iterable::Iterator Iterable::begin() &&'
45 | Iterator begin() && { return Iterator(std::move(_gen)); }
| ^~~~~
Compiler returned: 1
Removing &&
from Iterator::begin
works, but feels semantically wrong. Is there a better option to achieve what I am trying to do and still use it in a for loop?
本文标签: cForIterable wrapper around readonce generatorStack Overflow
版权声明:本文标题:c++ - For-Iterable wrapper around read-once generator - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745562882a2663581.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论