On Wed, 04 Sep 2013 11:49:41 +0200, anonymous wrote: > On Wednesday, 4 September 2013 at 00:56:39 UTC, Jonathan Crapuchettes > wrote: >> If a range struct (Range) is defined inside another struct (Test), how >> can the constness or mutability of Test be attributed to the return >> type of Range.front? I'm running into this problem because I need the >> range to be iterated, but I need the pointer in T to be marked const >> when appropriate. >> >> Thank you, >> JC >> >> Pseudo-Example: >> struct Test { >> static struct T { >> uint* ptr; >> } >> ... >> >> auto opSlice() inout { >> static struct Range { >> inout(T) front() @property { >> ... >> } >> ... >> } >> >> return Range(); >> } >> } > > > You can use a Template This Parameter [1] instead of inout: > ---- > auto opSlice(this This)() > { > static if(is(This == const)) alias QualifiedT = const T; > else alias QualifiedT = T; > > static struct Range { > QualifiedT front() @property { > ---- > > [1] http://dlang.org/template.html#TemplateThisParameter
Thank you for the help. That worked, but now I ran into another similar issue. What if the Range struct is being defined outside of the opSlice method? I have a number of methods in a struct that return the same range type and would rather not have to have duplicate code or need to use mixins. JC