www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - (this MyType) automatic deduction?

reply "andre" <andre s-e-a-p.de> writes:
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)()
Oct 08 2014
parent reply "anonymous" <anonymous example.com> writes:
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) */ } ----
Oct 08 2014
parent "andre" <andre s-e-a-p.de> writes:
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) */ } ----
Oct 08 2014