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