Rebind template(bug?)

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Aug 21 17:22:48 PDT 2016


On 08/22/2016 12:06 AM, Engine Machine wrote:
> T!()'s "data" is specified in the class just like all the other
> derivations. I don't want to have to specify an external base class as
> in your InstaniateOrBase. Why? Because!!! (There should be no need to,
> and if one goes this route of creating classes, it should be all or
> nothing, else there is no real benefit)

You make it sound like I came up with the external base class, but I 
just took that from your code.

[...]
> It seems that when one uses `class T(A...) : X`, one can't, for some X,
> not have inheritance. The compiler expects X to be something inheritable
> from no matter what.

I didn't know it, but your code shows that X can also be an empty 
compile time list (Seq). I have no idea if this is in the spec, or if it 
just happens to work with dmd.

If it's valid D, you just need a template that goes from T and A to 
T!(A[0 .. $ - 1]), or if A is already empty, to the empty Seq.

Like so:

----
template InstantiateOrEmptySeq(alias tmpl, args...)
{
     alias Seq(T...)=T;
     static if (args.length > 0)
         alias InstantiateOrEmptySeq = tmpl!(args[0 .. $ - 1]);
     else
         alias InstantiateOrEmptySeq = Seq!();
}

class T(A...) : InstantiateOrEmptySeq!(T, A)
{
     ...
}
----




More information about the Digitalmars-d-learn mailing list