It's a class! It's a struct! It's ... SuperStruct!
Timon Gehr via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Wed Oct 21 16:09:52 PDT 2015
On 10/18/2015 09:00 PM, rcorre wrote:
> SuperStruct is a struct that acts like a class:
>
> ---
> struct Square {
> float size;
> float area() { return size * size; }
> }
>
> struct Circle {
> float r;
> float area() { return r * r * PI; }
> }
>
> alias Shape = SuperStruct!(Square, Circle);
>
> // look! polymorphism!
> Shape sqr = Square(2);
> Shape cir = Circle(4);
> Shape[] shapes = [ sqr, cir ];
>
> // call functions that are shared between the source types!
> assert(shapes.map!(x => x.area).sum.approxEqual(2 * 2 + 4 * 4 * PI));
> ---
>
> SuperStruct is basically a Variant that exposes the common members of
> its source
> types. You can check it out here:
>
> https://github.com/rcorre/superstruct
>
> I'm not quite sure if this is a good idea (or if it already exists in some
> form that I haven't seen), but it was fun to work on. There's a lot more
> info on
> the README if you're curious. Let me know what you think!
"A call signature for a given member is 'compatible'
* if, for an instance of any one of `SubTypes`, that member can be
called with
* the provided set of arguments _and_ all such calls have a common
return type."
Probably you could/should return your SuperStruct instead of the/when
there is no common return type.
More information about the Digitalmars-d-announce
mailing list