Clay language

Steven Schveighoffer schveiguy at yahoo.com
Fri Dec 31 06:37:50 PST 2010


On Thu, 30 Dec 2010 21:14:28 -0500, Simen kjaeraas  
<simen.kjaras at gmail.com> wrote:

> Andrej Mitrovic <andrej.mitrovich at gmail.com> wrote:
>
>> On 12/31/10, Simen kjaeraas <simen.kjaras at gmail.com> wrote:
>>>
>>
>> This will give you both:
>>
>> class A
>> {
>>     void bar(this T) ( )
>>     {
>>         writeln(typeid(T));
>>         writeln(typeid(this));
>>     }
>> }
>>
>> class B : A
>> {
>> }
>>
>> void main( )
>> {
>>     A a = new B;
>>     a.bar();
>> }
>
> Indeed it will. Now, if you look closely, you will see that typeid(T) is  
> A, while typeid(this) is B. Testing further:
>
> class A {
>     void baz() {
>         writeln(typeid(this));
>     }
> }
> class B : A {
> }
>
> void main() {
>      A a = new B;
>      a.baz(); // prints B.
> }
>
> We thus see that the template this parameter has absolutely no value.

No, it does have value:

class A
{
    string x;
    T setX(this T, U)(U newx)
    {
       this.x = to!string(newx);
       return cast(T)this;
    }
}

class B : A
{
    int y;
    void setY(int newy)
    {
       this.y = newy;
    }
}


void main()
{
    auto b = new B;
    b.setX(5).setY(6);
}

Hey, look! covariance with templates :)

Now if only templates worked in interfaces...

I also have to write a helper function to eliminate that cast (which does  
a runtime lookup).

-Steve


More information about the Digitalmars-d mailing list