(this MyType) automatic deduction?

2014-10-08 Thread andre via Digitalmars-d-learn

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)()


Re: (this MyType) automatic deduction?

2014-10-08 Thread anonymous via Digitalmars-d-learn

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)
*/
}



Re: (this MyType) automatic deduction?

2014-10-08 Thread andre via Digitalmars-d-learn

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)

*/
}