Limited Semi-PolyMorphic (LSP) structs?

H. S. Teoh hsteoh at quickfur.ath.cx
Tue Aug 27 22:12:27 PDT 2013


On Wed, Aug 28, 2013 at 06:45:11AM +0200, Era Scarecrow wrote:
> On Wednesday, 28 August 2013 at 03:45:06 UTC, Andre Artus wrote:
> >Era,
> >
> >I haven't had time to go through your everything you wrote here
> >but are you looking to create some form of discriminated union
> >(AKA tagged union) using D structs?
> >
> >Do you have a specific problem you need to solve, or are you just
> >exploring the language?
> 
>  The tagged union struct does sorta match the basic idea. What i
> have is a structure that basically is just a single struct, however
> it's semi-polymorphic. (I guess that's obvious by the subject). What
> changes is only really behavior and rarely would it actually add
> more data, so inheriting and OOP fits it fairly well, however since
> structs can't inherit it becomes an issue. I can either inherit, or
> i can make the function(s) large and clunky and basically do it as
> C.
[...]

One trick that you may find helpful, is to use alias this to simulate
struct inheritance:

	struct Base {
		int x;
	}

	struct Derived1 {
		Base __base;
		alias __base this;
		int y;
	}

	struct Derived2 {
		Base __base;
		alias __base this;
		int z;
	}

	void baseFunc(Base b) { ... }
	void derivFunc1(Derived1 d) {
		auto tmp = d.y;
		auto tmp2 = d.x; // note: "base struct" member directly accessible
	}
	void derivFunc2(Derived2 d) {
		auto tmp = d.z;
		auto tmp2 = d.x;
	}

	Derived1 d1;
	Derived2 d2;
	baseFunc(d1); // OK
	baseFunc(d2); // OK
	derivFunc1(d1); // OK
	//derivFunc2(d1); // Error: Derived1 can't convert to Derived2
	derivFunc2(d2); // OK

This won't help you if you need a single variable to store both structs
"derived" this way, though, 'cos you wouldn't know what size the structs
should be. You *could* get away with using Base* (Base pointers) in a
semi-polymorphic way as long as you're sure the derived structs don't go
out of scope before the Base*, but it gets a bit tricky at that point,
and you start to need real classes instead.


T

-- 
Once bitten, twice cry...


More information about the Digitalmars-d-learn mailing list