Virtual methods on stack objects

dangbinghoo dangbinghoo at gmail.com
Thu May 12 02:58:59 UTC 2022


On Wednesday, 11 May 2022 at 20:53:21 UTC, Marvin Hannott wrote:
> On Wednesday, 11 May 2022 at 20:23:07 UTC, Ali Çehreli wrote:
>> [...]
>
> Yeah, but you can't return `Cat` 😉. And the documentation for 
> `scoped` says:
>>[...]
>
> That's kinda very limiting.
>
> Anyway, I cooked up another idea based on your first 
> suggestions.
> ```D
> struct S
> {
>     static private interface I
>     {
>         int f(int i);
>     }
>
>     static private final class A : I
>     {
>         int f(int i) {return i;}
>     }
>
>     static private final class B : I
>     {
>         int f(int i) {return i+ 1;}
>     }
>
>     private I i;
>     private int d;
>
>     this(int d)
>     {
>         this.d = d;
>         if(d < 10)
>         {
>             i = scoped!A();
>         }else {
>             i = scoped!B();
>         }
>     }
>
>     int f() { return i.f(d);}
> }
> ```
> I mean, this is a super dumb example, but it kinda works. And I 
> think it could be made a lot less tedious with some mixin magic.

add a single `writeln("A.f")` to A.f and `writeln("B.f")` B.f, 
and a simple test

```d
     void main()
     {
         S s1 = S(9);
         S s2 = S(12);
         s1.f();
         s2.f();
     }
```

outputs:

```
A.f
Error: program killed by signal 11
(Aka.  segmentation fault !)
```



More information about the Digitalmars-d-learn mailing list