Rewriting a c++ template to D (replacing iterator with ranges "properly")
aliak
something at something.com
Fri Jan 26 15:32:51 UTC 2018
On Friday, 26 January 2018 at 14:59:09 UTC, Simen Kjærås wrote:
> what is N here? You're declaring it to be an int value in the
> template<> definition, and then use it as a type in the
> function definition.
Oops again :) Should've been typename N (where N is some integral
type).
> Not exactly. range.front will assert after the last popFrontN
> (since the range is empty).
Ya, sorry, realized this a bit after I posted.
> It's trying to combine 3 and 4 I think, but it fails because
> this is allowed in D:
>
> int a;
> a = false;
Ah true, so it's more of a is(ElementType!R : bool) check?
>
> You'll want to pass the range as ref. hasLvalueElements checks
> if the elements have lvalue semantics
Doh, of course. It's in the name even!
> import std.range;
>
> struct R {
> int[3] elements;
> int index;
>
> ref auto front() {
> return elements[index];
> }
>
> void popFront() {
> ++index;
> }
>
> bool empty() {
> return index >= elements.length;
> }
> }
>
> unittest {
> assert(hasLvalueElements!(R));
> auto a = R([1,2,3], 0);
> auto b = a;
> b.front = 4;
> assert(a.elements == [1,2,3]);
> assert(b.elements == [4,2,3]);
> }
>
> As we can see, b is a complete copy of a, and changing b does
> not change a. The exact same behavior would occur if a was
> passed by value to a function.
>
> --
> Simen
Thanks for the input!
More information about the Digitalmars-d-learn
mailing list