On 03/05/2012 11:33 PM, H. S. Teoh wrote:
On Mon, Mar 05, 2012 at 08:41:53PM +0000, Justin Whear wrote:
On Mon, 05 Mar 2012 12:16:14 -0800, H. S. Teoh wrote:
I know D doesn't really have RTTI yet, but I'm experimenting with
"faking" it by doing something like:
class A {
string prop1;
int prop2;
...
void serialize() {
__serialize(this);
}
}
void __serialize(T)(T obj) {
writeln(typeid(obj));
foreach (name; __traits(derivedMembers, T)) {
writefln("%s = %s", name,
__traits(getMember,obj,name));
}
}
The only thing is, serialize() has to be declared in every derived
class, because T needs to be known at compile-time. Is there a way to
"automate" this? I.e., automatically insert the serialize() boilerplate
code into derived classes?
(P.S. D just took on brand new levels of cool when I realized I could
do something like this. Imagine doing this with C++ templates... ugh!
What a painful thought!)
T
The normal approach is to use a string mixin statement in each derived
class:
template Serializable()
{
enum Serializable = q{...your code here...};
}
class B : A
{
mixin(Serializable);
}
Unfortunately, I don't believe there's any mechanism to order derived
classes to automatically perform the mixin.
OK, it's a bit ugly I supopse, but I can live with that.
Is there a way to tell whether or not a given class is a derived class
or not? I'm using the Serializable template to insert serialize() into
the class, and for derived classes I need to insert "override void
serialize() ..." but for the base class I have to omit "override". How
can I detect this in the template?
Thanks!
T
You can check typeof(this).