Reset all Members of a Aggregate Instance

Chris Wright via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Dec 3 13:38:48 PST 2015


The terrible way is something like:

void reset(Object o)
in {
  assert(!(o is null));
}
body {
  auto p = cast(ubyte*)*cast(void**)&o;
  auto ci = o.classinfo;
  auto init = cast(ubyte)ci.init;
  p[0..init.length] = init[];
  if (ci.defaultConstructor) {
    ci.defaultConstructor(o);
  } else {
    throw new Exception("no default constructor; object is in invalid 
state");
  }
}

An object reference is just a pointer, but we can't directly cast it. So 
we make a pointer to it and cast that; the type system allows it. Now we 
can access the data that the object reference refers to directly.

`o.classinfo` gets the runtime type information object for the actual 
class that `o` belongs to. The `init` property gives you a single blob of 
bytes representing the default field values of that class. So we copy 
that over into the object.

To finish up, if the type has a default constructor, we invoke it. We 
don't have a way to identify any other constructors that we could invoke.

This is usually not a good thing to do, but if you really need to, you 
can.


More information about the Digitalmars-d-learn mailing list