Thread overview
How to get the type of a derived class in a method of its base class?
Feb 19, 2017
Max Samukha
Feb 19, 2017
aberba
Feb 19, 2017
Mike Parker
Feb 19, 2017
biozic
February 19, 2017
class A {
    this(T = this)() {
        static assert(is(T == B));
    }
}

class B {
}

auto b = new B;

Here, T becomes A, which may be reasonable but is completely useless. Is there a way to obtain the type of the class (or class instance reference) the method is called on?
February 19, 2017
On Sunday, 19 February 2017 at 07:52:13 UTC, Max Samukha wrote:

>
> class B {
> }
>
> auto b = new B;
>
> Here, T becomes A, which may be reasonable but is completely useless. Is there a way to obtain the type of the class (or class instance reference) the method is called on?

is B not supposed to inherit from A?
like

class B: A {}
February 19, 2017
On Sunday, 19 February 2017 at 07:52:13 UTC, Max Samukha wrote:
> class A {
>     this(T = this)() {
>         static assert(is(T == B));
>     }
> }
>
> class B {
> }
>
> auto b = new B;
>
> Here, T becomes A, which may be reasonable but is completely useless. Is there a way to obtain the type of the class (or class instance reference) the method is called on?

I believe template this parameters[1] are what you're looking for here.

https://dlang.org/spec/template.html#template_this_parameter
February 19, 2017
On Sunday, 19 February 2017 at 07:52:13 UTC, Max Samukha wrote:
> class A {
>     this(T = this)() {
>         static assert(is(T == B));
>     }
> }
>
> class B {
> }
>
> auto b = new B;
>
> Here, T becomes A, which may be reasonable but is completely useless. Is there a way to obtain the type of the class (or class instance reference) the method is called on?

Not at compile time:

class A
{
    this()
    {
        assert(typeid(this) == typeid(B));
    }
}

class B : A
{
}

auto b = new B;