www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Functor alias this

reply DaggetJones <Dagget.Jones gmail.com> writes:
Hi, I'm wondering how I should approach supplying 
functions/delegates around in D. I have option of using classes 
where the function exists inside the class and to provide 
different functionality different classes are created.
Alternatively I could just pass the function directly around 
without all the weight of the class.

This led me to wonder if there is a way to combine the two 
methods?


With D's alias this would it be possible to have the user code 
treat the function as a delegate but define the functions 
actually in a class without any restrictions?


import std.stdio;

alias MyFunction = int delegate();

class MyFunctor
{
    alias func this;
    int MyData = 5;
    int func() { return MyData; }
}



void bar(MyFunction foo) { writeln(foo()); }

void main()
{

	MyFunctor f = new MyFunctor();
	
	bar(&f.func);
         // but not
         // bar(f); or bar(&f);
	
}


But I would like to simply pass the class as if it were the 
member func, which is what the alias this is suppose to provide.

It seems D ignores the alias this in this case?
Jun 05 2018
parent Simen =?UTF-8?B?S2rDpnLDpXM=?= <simen.kjaras gmail.com> writes:
On Wednesday, 6 June 2018 at 06:25:49 UTC, DaggetJones wrote:
 Hi, I'm wondering how I should approach supplying 
 functions/delegates around in D. I have option of using classes 
 where the function exists inside the class and to provide 
 different functionality different classes are created.
 Alternatively I could just pass the function directly around 
 without all the weight of the class.

 This led me to wonder if there is a way to combine the two 
 methods?


 With D's alias this would it be possible to have the user code 
 treat the function as a delegate but define the functions 
 actually in a class without any restrictions?


 import std.stdio;

 alias MyFunction = int delegate();

 class MyFunctor
 {
    alias func this;
    int MyData = 5;
    int func() { return MyData; }
 }



 void bar(MyFunction foo) { writeln(foo()); }

 void main()
 {

 	MyFunctor f = new MyFunctor();
 	
 	bar(&f.func);
         // but not
         // bar(f); or bar(&f);
 	
 }


 But I would like to simply pass the class as if it were the 
 member func, which is what the alias this is suppose to provide.

 It seems D ignores the alias this in this case?
You'll need to provide a function that returns func. The way it's currently written, the alias this would basically translate to bar(f.func()): class MyFunctor { alias func2 this; int MyData = 5; int func() { return MyData; } auto func2() { return &func; } } -- Simen
Jun 05 2018