April 20, 2022

On Tuesday, 19 April 2022 at 20:29:01 UTC, Steven Schveighoffer wrote:

>

You can work around the dual context, if you are OK with passing the second context explicitly.

The easiest way is to move the member function to a UFCS function. an example:

struct X
{
   int x;
   void applyToX(alias fn)() {fn(x);}
}

void applyToX_alt(alias fn)(ref X xval) {
   fn(xval.x);
}

void main()
{
   auto s = X(5);
   int y = 6;
   void fn(ref int x) { x += y; }
   s.applyToX!fn; // error, dual context needed
   s.applyToX_alt!fn; // fine, only single context needed
}

I used struct to understand the problem. I don't actually have an object context to pass like in your example, the only context I have is template parameters.

April 19, 2022

On 4/19/22 8:44 PM, Andrey Zherikov wrote:

>

On Tuesday, 19 April 2022 at 20:29:01 UTC, Steven Schveighoffer wrote:

>

You can work around the dual context, if you are OK with passing the second context explicitly.

The easiest way is to move the member function to a UFCS function. an example:

struct X
{
   int x;
   void applyToX(alias fn)() {fn(x);}
}

void applyToX_alt(alias fn)(ref X xval) {
   fn(xval.x);
}

void main()
{
   auto s = X(5);
   int y = 6;
   void fn(ref int x) { x += y; }
   s.applyToX!fn; // error, dual context needed
   s.applyToX_alt!fn; // fine, only single context needed
}

I used struct to understand the problem. I don't actually have an object context to pass like in your example, the only context I have is template parameters.

That's because your code is not an example of the dual context problem -- only one context is needed. Your code is triggering an actual bug in the compiler.

-Steve

1 2
Next ›   Last »