Defining inout returned values for ranges

Jonathan Crapuchettes jcrapuchettes at gmail.com
Thu Sep 5 12:19:42 PDT 2013


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


More information about the Digitalmars-d-learn mailing list