Thread overview |
---|
October 08, 2014 (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)() |
October 08, 2014 Re: (this MyType) automatic deduction? | ||||
---|---|---|---|---|
| ||||
Posted in reply to andre | 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 Re: (this MyType) automatic deduction? | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | 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)
> */
> }
> ----
|
Copyright © 1999-2021 by the D Language Foundation