www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - How to get the type of a derived class in a method of its base class?

reply Max Samukha <maxsamukha gmail.com> writes:
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?
Feb 18 2017
next sibling parent aberba <karabutaworld gmail.com> writes:
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 {}
Feb 19 2017
prev sibling next sibling parent Mike Parker <aldacron gmail.com> writes:
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
Feb 19 2017
prev sibling parent biozic <dransic gmail.com> writes:
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;
Feb 19 2017