How to provide this arg or functor for algorithm?

FreeSlave via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Aug 16 09:23:01 PDT 2015


On Sunday, 16 August 2015 at 15:29:10 UTC, Ali Çehreli wrote:
> On 08/16/2015 04:53 AM, FreeSlave wrote:
>
> > The problem is that this allocates delegate, so it can't be
> used in
> > @nogc code.
>
> Would constructing the delegate by setting its .funcptr and 
> .ptr properties work in this case? You can have a pool of 
> context objects which become the context for the delegate.
>
>   http://ddili.org/ders/d.en/lambda.html#ix_lambda..funcptr
>
> Ali

I don't see how this can solve the problem.

What I tried:

import std.stdio;
import std.range;
import std.algorithm;

struct Caller
{
     this(uint context) {
         _context = context;
     }
     uint method(uint value) {
         return _context * value;
     }

     uint _context;
}

@nogc auto func(uint[] arr, uint function(uint) f)
{
     return arr.map!(f);
}

void main(string[] args)
{
     uint[] arr = [1,2,3];
     uint context = 2;
     auto c = Caller(context);
     auto d = &c.method;
     writeln(func(arr, d.funcptr));
}

It still says it needs allocation:

test.d(17): Error: function test.func @nogc function allocates a 
closure with the GC

funcptr does not play any role here, since passing the delegate 
directly leads to the same error.



More information about the Digitalmars-d-learn mailing list