On 10/3/21 3:22 PM, rjkilpatrick wrote:

> I am trying to emulate Python's list in D, to store some derived classes

I notice your code comment about SuperClass[]. It is still the most obvious solution here. You just need to check the reuslt of a cast(DerivedClass):

import std.stdio : writefln;
import std.variant;
import std.conv;

// Arbitrary super class
class SuperClass {
     this() {
     }
}

// Derived class with members
class DerivedClass : SuperClass {
public:
     this(float a) {
         this.a = a;
     }
     float a;
}

class OtherDerivedClass : SuperClass {}

void main() {
// When we use `SuperClass[] list;` here, we find 'a' is hidden by the base class

  // [Ali]: When you must know what the exact derived type you
  //        are using, generally there is a better approach.
  //
  //        Assuming that you really want to "downcast", then you
  //        simply cast to DerivedClass and see whether the
  //        pointer is null or not. (See below.)

  SuperClass[] list;

  // Attempting to append derived class instances to list
  list ~= new DerivedClass(1.0f);
  list ~= new OtherDerivedClass;

  foreach (i, item; list) {
    auto p = cast(DerivedClass)item;

    if (p) {
      writefln!"%s: Yes, a DerivedClass object with a == %s."(i, p.a);

    } else {
      writefln!"%s: No, not a DerivedClass object."(i);
    }
  }
}

Ali

Reply via email to