(this MyType) automatic deduction?

anonymous via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Oct 8 14:10:02 PDT 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)
*/
}
----


More information about the Digitalmars-d-learn mailing list