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