On Saturday, 20 August 2016 at 10:04:07 UTC, Timon Gehr wrote:
On 20.08.2016 00:07, Engine Machine wrote:
On Friday, 19 August 2016 at 21:07:42 UTC, Timon Gehr wrote:
On 19.08.2016 20:25, Engine Machine wrote:
So we can create types relationships easier:

class Type(T) : Type!null
{
   int x;
   static if (T is Dog)
       int y;


alias Seq(T...)=T;

template TypeParent(T...) if(T.length==1){
static if(is(typeof(T[0])==typeof(null))) alias TypeParent = Seq!();
    else alias TypeParent = Seq!(Type!null);
}

class Type(T...): TypeParent!T if(T.length==1){
   int x;
   static if (T is Dog)
       int y;
}

This is a bit verbose

Apart from the workaround for the ridiculous alias template parameter semantics, I think the length of the code more or less matches the specificity of the requested behaviour. (There should be ways to abstract out most of it, in case you need this really often.)

Yes, it is not too bad. One doesn't need to T.length part so it is a little shorter. Took me a bit to get used to it.



and not quite right (T is Dog should be something
like T[0], or whatever).
...

('T is Dog' does not work anyway.)


Yes, I use strings, but it doesn't really matter, it can be made to work.



It does essentially work. My only complaint is that it would be nice to be able to export an alias to Type!() = Type; in the namespace of the type being created. Doubt that D can do that!? If it can, then it should
be an adequate solution.

That is

It would be nice to have something like

alias Type = Type!();
class Type(T...): TypeParent!T if(T.length==1){
    int x;
    static if (T is Dog)
        int y;
}

I don't understand how this is related.


The only difference is the alias Type = Type!(); Again, D can't do this but the point is that it would be nice to have the alias. One can't do everything as a "library" solution.

Trying to expand your code results in some odd behavior:


public template TypeParent(P)
{       
        import std.traits;
        alias T = TemplateArgsOf!P;
        alias Seq(T...) = T;
    static if (T.length == 0 || is(typeof(T[0]) == typeof(null)))
        {
                alias TypeParent = Seq!();              
        }
    else
        {
                alias TypeParent = Seq!(P!(T[0..T.length-1]));
        }
}


class Type(T...) : TypeParent!(Type!T)
{
        int x;
        static if (T.length >= 1 && T[0] is "Animal")
        {
                int y;
                static if (T.length >= 2 && T[1] is "Dog")
                {
                        int z;
                        static if (T.length >= 3&& T[2] is "Pug")
                        {
                                int s;
                        }
                }

        }
}


void main()
{

        import std.traits;

        auto a = new Type!("Animal", "Dog", "Pug")();
        Type!("Animal", "Dog") b = a;       
        Type!("Animal") c = b;        

        a.s = 1;
        b.z = 2;
        c.y = 3;
}

b and c are of type P!, not Type!

Reply via email to