February 09, 2006
Don's comment about how D templates are resolved during compilation instead of optimization got me thinking whether the traditional get/set accessor method for tuples could be replaced by a simple alias, which seems ideal as it doesn't rely on inlining to make the resulting code efficient.  What follows is an attempt at this, first with a class, then with a struct.  Note that the class version compiles but the struct version breaks.  I assume this is a bug?

C:\code\d>type test.d
void main()
{
    ClassOf!(int)  c = new ClassOf!(int)();
    StructOf!(int) s;
    int            x;

    c.ref!() = x;
    x = c.ref!();

    s.ref!() = x;
    x = s.ref!();
}

class ClassOf(Type)
{
    Type val;

    template ref()
    {
        alias val ref;
    }
}

template StructOf( Type )
{
    struct StructOf
    {
        Type val;

        template ref()
        {
            alias val ref;
        }
    }
}
C:\code\d>dmd test.d
test.d(10): this for val needs to be type StructOf not type StructOf

C:\code\d>
February 12, 2006
Sean Kelly schrieb am 2006-02-09:
> Don's comment about how D templates are resolved during compilation instead of optimization got me thinking whether the traditional get/set accessor method for tuples could be replaced by a simple alias, which seems ideal as it doesn't rely on inlining to make the resulting code efficient.  What follows is an attempt at this, first with a class, then with a struct.  Note that the class version compiles but the struct version breaks.  I assume this is a bug?
>
> C:\code\d>type test.d
> void main()
> {
>      ClassOf!(int)  c = new ClassOf!(int)();
>      StructOf!(int) s;
>      int            x;
>
>      c.ref!() = x;
>      x = c.ref!();
>
>      s.ref!() = x;
>      x = s.ref!();
> }
>
> class ClassOf(Type)
> {
>      Type val;
>
>      template ref()
>      {
>          alias val ref;
>      }
> }
>
> template StructOf( Type )
> {
>      struct StructOf
>      {
>          Type val;
>
>          template ref()
>          {
>              alias val ref;
>          }
>      }
> }
> C:\code\d>dmd test.d
> test.d(10): this for val needs to be type StructOf not type StructOf
>
> C:\code\d>

Added to DStress as http://dstress.kuehne.cn/run/a/alias_31_A.d http://dstress.kuehne.cn/run/a/alias_31_B.d http://dstress.kuehne.cn/run/a/alias_31_C.d http://dstress.kuehne.cn/run/a/alias_31_D.d

Thomas