On Wednesday, 8 December 2021 at 12:17:42 UTC, Stanislav Blinov wrote:
On Wednesday, 8 December 2021 at 08:07:59 UTC, Petar Kirov [ZombineDev] wrote:

```d
interface ICallable
{
    void opCall() const;
}

alias Action = void delegate();

struct A
{
    Action[] dg;
}
```

At this point why not just call a spade a spade and store an array of ICallables directly? :) I mean, why store fat pointers to fat pointers?

Initially that's exactly what I tried, and it worked if the result was stored as `static const` / `static immutable`, but it didn't when using the `enum`:


```
onlineapp.d(39): Error: variable `onlineapp.main.a` : Unable to initialize enum with class or pointer to struct. Use static const variable instead.
```

```d
interface ICallable
{
    void opCall() const;
}

auto makeDelegate(alias fun, Args...)(auto ref Args args)
{
    return new class(args) ICallable
    {
        Args m_args;
        this(Args p_args) { m_args = p_args; }
        void opCall() const { fun(m_args); }
    };
}

alias Action = void delegate();

ICallable createDelegate(string s)
{
    import std.stdio;
    return makeDelegate!((string str) => writeln(str))(s);
}

struct A
{
    ICallable[] dg;
}

A create()
{
    A a;
    a.dg ~= createDelegate("hello");
    a.dg ~= createDelegate("buy");
    return a;
}

void main()
{
    enum a = create();
    foreach(dg; a.dg)
        dg();
}
```


I didn't have time to fully investigate the issue and report this compiler limitation.

Reply via email to