== Quote from Jarrett Billingsley ([email protected])'s article
> On Wed, Apr 22, 2009 at 12:42 AM, dsimcha <[email protected]> wrote:
> > I'm working on porting dstats to ranges and I've run across an interestin
> g
> > problem.  I've defined a range that I'm going to use for joint entropy,
>  etc.
> > It's basically a tuple with some special properties.  Let's say I have
> a
> > template struct:
> >
> > struct Joint(T...) {
> >   T ranges;
> > }
> >
> > It's built with:
> >
> > SomeType joint(T...)(T args) { // do stuff. }
> >
> > When one of the arguments is a Joint, I want it to flatten.  For exampl
> e,
> >
> > Joint!(uint[], uint[]) r1;
> > uint[] r2;
> > auto result = joint(r1, r2);
> > // result is a Joint!(uint[], uint[], uint[]), not a
> > // Joint!(Joint!(uint[], uint[]), uint[]).
> >
> > Is there an easy metaprogramming trick that I've overlooked to make stuff
> > flatten like this?
> So before reading the following solution, don't get your hopes up too
> much.  There's a compiler bug that prevents it from working.
> template Tuple(T...)
> {
>       alias T Tuple;
> }
> template FlattenJoint(T : Joint!(U), U...)
> {
>       alias FlatJoint!(U) FlattenJoint;
> }
> template FlattenJoint(T)
> {
>       alias T FlattenJoint;
> }
> template FlatJoint(T...)
> {
>       static if(T.length == 0)
>               alias Tuple!() FlatJoint;
>       else
>               alias Tuple!(FlattenJoint!(T[0]), FlatJoint!(T[1 .. $])) 
> FlatJoint;
> }
> struct Joint(T...)
> {
>       FlatJoint!(T) ranges;
> }
> void main()
> {
>       Joint!(uint[], uint[]) r1;
>       Joint!(Joint!(uint[], uint[]), uint[]) r2;
>       pragma(msg, typeof(r1.ranges).stringof);
>       pragma(msg, typeof(r2.ranges).stringof);
> }
> This will print out:
> (uint[], uint[])
> (uint[])
> The second line really should be (uint[], uint[], uint[]), but there's
> something wrong with the way DMD matches the FlattenJoint template.  I
> was surprised, it does actually select the correct
> specialization(FlattenJoint(T : Joint!(U), U...), but for some reason,
> U is the empty tuple, even though T is Joint!(uint[], uint[]).
> I think it might have something to do with this bug (D2 is()
> expression, but a very similar mechanism and result):
> http://d.puremagic.com/issues/show_bug.cgi?id=1944

I guess I should clarify:  Getting the flattened type tuple is the easy part.  
He
hard part is getting the flattened parameter tuple, i.e. how do I copy all the
data over to the new Joint!(uint[], uint[], uint[]) struct in a generic way?

Reply via email to