How to declare "abstract" delegates list?

bauss via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri May 5 23:07:01 PDT 2017


On Friday, 5 May 2017 at 14:20:43 UTC, RedCAT wrote:
> Hello!
>
> Is it possible to create a list of slightly different delegates?
>
> For example, there is a class hierarchy:
>
> class Base;
> class DerivedOne : Base;
> class DerivedTwo : Base;
>
> And there are several delegates:
>
> void delegate(int, Base);
> void delegate(int, DerivedOne);
> void delegate(int, DerivedTwo);
>
> It's easy to see that the only difference in the declarations 
> of these delegates is the type of the second parameter, this is 
> the class inherited from Base.
>
> How can I create a list or an array where I can add these 
> delegates?

I would do something like this:

interface IMyDelegate { }

final class MyDelegate(T) : IMyDelegate {
     private:
     void delegate(int, T) _d;

     public:
     this(void delegate(int, T) d) {
         _d = d;
     }

     void opCall(int x, T y) {
         _d(x, y);
     }
}

... Below is simple usage demonstration ...

private IMyDelegate[] _delegates;

void addDelegate(T)(void delegate(int, T) d) {
     _delegates ~= new MyDelegate!T(d);
}

auto getDelegate(size_t index) {
     return cast(MyDelegate!T)_delegates[index];
}

...

void func1(int, Base) { ... }
void func2(int, DerivedOne) { ... }
void func3(int, DerivedTwo) { ... }

...

addDelegate(&func1);
addDelegate(&func2);
addDelegate(&func3);

(getDelegate!Base)(100, base);
(getDelegate!DerivedOne)(100, derivedOne);
(getDelegate!DerivedTwo)(100, derivedTwo);

By theory that should work. It's untested, so you might need a 
few tweaks here and there.


More information about the Digitalmars-d-learn mailing list