(this MyType) automatic deduction?
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?
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?
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) */ }