Parameterized delegate attributes

Lodovico Giaretta via Digitalmars-d digitalmars-d at puremagic.com
Wed Sep 28 14:35:40 PDT 2016


On Wednesday, 28 September 2016 at 20:23:10 UTC, pineapple wrote:
> But using a templated opApply currently breaks type inference 
> in `foreach`, right?
>
> It'd be really nice if that were fixed.

Yeah, it would be nice, but I don't think it's technically 
possible to fix it. The compiler cannot "guess" the correct 
opApply instantiation if you don't specify the variable type.

<SEMI-OT> This is due to opApply "inversion of control", so that 
instead of your code calling other code, other code calls yours. 
For this reason, I think that ranges are way more straightforward 
and should be preferred whenever possible </SEMI-OT>

By the way, just to show how opApply can be templated 
successfully to drive attribute inference:

=======================
struct Foo
{
     uint[2] array;

     int opApply(T : int delegate(ref uint))(scope T dg)
     {
	pragma(msg, "Instantiated with " ~ T.stringof);
		
         int result = 0;
		
         for (int i = 0; i < array.length; i++)
         {
             result = dg(array[i]);
             if (result)
                 break;
         }
         return result;
     }
}

void main()
{
     Foo a;

     a.array[0] = 73;
     a.array[1] = 82;

     foreach (ref uint u; a)
     {
	(() @system => u++)();
     }

     foreach (uint u; a)
     {
	import std.stdio;
         writeln(u);
     }
}
=======================


More information about the Digitalmars-d mailing list