Coreect way to create delegate for struct method.

Alex sascha.orlov at gmail.com
Tue Aug 21 22:52:31 UTC 2018


On Tuesday, 21 August 2018 at 21:29:38 UTC, Andrey wrote:
> Hello,
> This is a code:
>>import std.stdio;
>>
>>struct Test
>>{
>>    static Test opCall()
>>    {
>>        Test test;
>>        test.handler = &test.one;
>> 
>>        return test;
>>    }
>> 
>>    void one() const { writeln("In handler: Address = ", &this, 
>> "; Text = ", text); }
>> 
>>    void execute()
>>    {
>>        text = "Inited!";
>>        writeln("Before: Address = ", &this, "; Text = ", text);
>>        handler();
>>    }
>> 
>>    void delegate() const handler = void;
>>    string text = "NoValue";
>>}
>>
>>struct Qwerty
>>{
>>    void prepare()
>>    {
>>        _test = Test();
>>    }
>> 
>>    void execute()
>>    {
>>        _test.execute();
>>    }
>> 
>>private:
>>    Test _test  = void;
>>}
>>
>>void main()
>>{
>>    Qwerty qwerty;
>>    qwerty.prepare();
>>    qwerty.execute();
>>}
>
> Here I try to make a delegate for struct "Test" and method 
> "one()".
> When I launch it then I get this output:
>>Before: Address = 7FFC096A2C20; Text = Inited!
>>In handler: Address = 7FFC096A2BE8; Text = NoValue
>
> It means that my delegate captures one object of Test, but in 
> place of call uses another...
> I want just to save my method into variable and after that use 
> it on some arbitrary object of type "Test". How to do it in D?
>
> In C++ it is very easy:
>> test.handler = &Test::one;
> and call:
>> (this->*handler)();
> or
>> (someTestObjPtr->*handler)();
> I know axactly that in the first variant a context will be 
> "this", and in the second - "someTestObjPtr".

Maybe, like this:

´´´
import std.stdio;

struct Test
{
     static auto opCall()
     {
         auto test = new Test();
         test.handler = &test.one;
         return test;
     }

     void one() const { writeln("In handler: Address = ", &this, 
"; Text = ", text); }

     void execute()
     {
         text = "Inited!";
         writeln("Before: Address = ", &this, "; Text = ", text);
         handler();
     }

     void delegate() const handler = void;
     string text = "NoValue";
}

struct Qwerty
{
     void prepare()
     {
         _test = Test();
     }

     void execute()
     {
         _test.execute();
     }

private:
     Test* _test  = void;
}

void main()
{
     Qwerty qwerty;
     qwerty.prepare();
     qwerty.execute();
}
´´´


More information about the Digitalmars-d-learn mailing list