@nogc with opApply

ag0aep6g anonymous at example.com
Sun Aug 12 01:39:21 UTC 2018


On 08/11/2018 12:00 PM, Alex wrote:
> ´´´
> import std.experimental.all;
> 
> static assert(isIterable!S);
> 
[...]
> 
> struct S
> {
[...]
>      int opApply(scope int delegate(ref uint) /*@nogc*/ operations) //@nogc
>      {
[...]
>      }
> }
> ´´´
> 
> Everything works fine, before I try to use the opApply function inside a 
> @nogc function.
> 
> If I do, compiler complains, that opApply is not marked as @nogc. Ok.
> If I try to mark opApply @nogc, I would have to mark operations delegate 
> also as @nogc, but I can't do this, as I do not know a priori, how it 
> will be used.
> 
> Now, as I learned at some point, a possibility would be, to templatify 
> the function, as the compiler can then derive, if @nogc apply or not.
> But if I write
> ´´´
> int opApply()(...){...}
> ´´´
> Then the static assert from above refuses to compile.
> 
> So... how to solve this case?

You can provide to overloads: one with @nogc, one without it. To keep it 
somewhat DRY, you can let them forward to a template implementation:

     int opApply(scope int delegate(ref uint) operations)
     {
         return opApplyImpl(operations);
     }
     int opApply(scope int delegate(ref uint) @nogc operations) @nogc
     {
         return opApplyImpl(operations);
     }
     int opApplyImpl(O)(O operations)
     {
         /* ... implementation here ... */
     }


More information about the Digitalmars-d-learn mailing list