On 2016-09-14 14:39, Jerry wrote:
I got a range which disables copy construction and I want to loop the
range within another loop using the same range.
So I thought I can mark the struct range with @disable this(this) and
then use refRange to initialize the loop.
So with something like this:
void main()
{
auto valueRange = FooRange("123");
foreach(ch; refRange(&valueRange))
writeln(ch);
}
struct FooRange {
@disable this();
@disable this(this);
this(string str) {
this.str = str;
}
@property bool empty() { return str.empty; }
@property dchar front() { return str.front; }
void popFront() { str.popFront; }
private:
string str;
}
But I get compile time errors messages saying:
std/range/package.d(8155,23): Error: struct app.FooRange is not copyable
because it is annotated with @disable
It feels strange that refRange ever want to copy.
Bug or feature?
As a workaround you can take the address of the range and use
std.algorithm.each:
void main()
{
auto valueRange = FooRange("123");
(&valueRange).each!(ch => writeln(ch));
}
With a convenience function:
T* ptr(ref T t){ return &t; }
void main()
{
auto valueRange = FooRange("123");
valueRange.ptr.each!(ch => writeln(ch));
}
--
/Jacob Carlborg