(this MyType) automatic deduction?

andre via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Oct 8 21:23:51 PDT 2014


Thanks a lot for the helpful explanation.

Kind regards
André

On Wednesday, 8 October 2014 at 21:10:02 UTC, anonymous wrote:
> On Wednesday, 8 October 2014 at 10:36:33 UTC, andre wrote:
>> Hi,
>>
>> could you check whether it is correct, that second line in main
>> failes with a compiler error?
>> I think the compiler should be able to deduce the type without
>> explicitly passing it to the method call.
>>
>> Kind regards
>> André
>>
>> template ClassTemplate()
>> {
>>  static auto deserialize(this MyType)()
>>  {
>>    return new MyType();
>>  }
>> }
>>
>> class A
>> {
>>  mixin ClassTemplate;
>> }
>>
>> void main()
>> {
>>  A a = A.deserialize!A(); // Working
>>  A b = A.deserialize(); // Not working
>> }
>>
>> source\app.d(17): Error: template 
>> app.A.ClassTemplate!().deserialize cannot dedu
>> ce function from argument types !()(), candidates are:
>> source\app.d(3):        
>> app.A.ClassTemplate!().deserialize(this MyType)()
>
> As far as I can tell, 'this' parameters don't work with static
> methods. You can use typeof(this) instead:
>
> ----
> template ClassTemplate()
> {
>    static auto deserialize()
>    {
>      return new typeof(this)();
>    }
> }
>
> class A
> {
>    mixin ClassTemplate;
> }
>
> void main()
> {
>    A b = A.deserialize();
> }
> ----
>
> Be aware of the difference between template 'this' parameters 
> and
> typeof(this). A 'this' parameter is set to the (static) type of
> the object, while typeof(this) is always the type of the
> surrounding class.
>
> ----
> class A
> {
>    import std.stdio;
>    void printTypeofThis() {writeln(typeof(this).stringof);}
>    void printThisParameter(this T)() {writeln(T.stringof);}
> }
>
> class B : A {}
>
> void main()
> {
>    auto b = new B;
>    b.printTypeofThis(); /* "A", because the method is in A */
>    b.printThisParameter(); /* "B", because b is a B 
> (statically) */
>    A a = b;
>    a.printThisParameter(); /* "A", because a is an A 
> (statically)
> */
> }
> ----



More information about the Digitalmars-d-learn mailing list