Thread overview
(this MyType) automatic deduction?
Oct 08, 2014
andre
Oct 08, 2014
anonymous
Oct 09, 2014
andre
October 08, 2014
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)()
October 08, 2014
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)
*/
}
----
October 09, 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)
> */
> }
> ----