[phobos] phobos commit, revision 1737

Michel Fortin michel.fortin at michelf.com
Thu Jul 8 07:33:44 PDT 2010


Le 2010-07-08 à 8:13, Andrei Alexandrescu a écrit :

> This is solid work! There's an opportunity here - it overlaps a LOT with std.variant.Algebraic.


Indeed. It's great. But why is the protection level set to 'package'? Isn't it meant to be used outside of Phobos?


> Essentially it would be best if you integrated opDispatch, _onActiveDuck, and friends inside Algebraic. Then Algebraic would become meta-duck - it still supports any combination of types, but you can call any method they share against the Algebraic.

One thing I've missed about Algebraic is the ability to switch on the type, somewhat like this:

	Algebraic!(A, B, C) x;
	switch (x.type) {
		case x.typecode!A:
		case x.typecode!B:
		case x.typecode!C:
			...
	}

Seems like this would be easy by switching on Any's _duckID, but this facility isn't exposed (it's all private).

Also, this approach using _duckID is a big difference from VariantN (and its derivative Algebraic), which stores a pointer to the typeid to identify the type instead of using a compile-time constant. I think the compile time constant is better since beside being switch-friendly it makes optimizations easier for the compiler.

So I think it'd be better to simply replace Algebraic's implementation with the one from Any. Or perhaps Algebraic and VariantN could be retrofitted so it can use a constant instead of a typeid pointer, but I'm not sure how it'd work.


> P.S. I *love* the trick with the homonym inner namespace! It solves the naming problem so elegantly. I'll use it in RefCounted too.

It's a nice trick and a good application of it.

In fact, I remember myself proposing something similar to allow properties with overloaded operators a few months ago when the property debate was raging. :-)

-- 
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/





More information about the phobos mailing list