getting all children classes in program

Baz via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Jan 3 07:37:05 PST 2015


On Saturday, 3 January 2015 at 15:00:53 UTC, Ondra wrote:
>
>>
>> I'm not sure if there's a way around that other than to add 
>> some code in the class to register itself. You could use a 
>> static constructor that adds itself to a list.
>>
>> Or, to give each class a shared ID, you could add a static 
>> member which returns some variation of its typeinfo. In fact, 
>> typeid(any_class) returns a unique identifier for each class 
>> (an instance of TypeInfo), maybe you can use it directly.
>
> Hi Adam,
>
> static this is probably way to go, I wanted to avoid this 
> solution because if it leads to copy-pasting code to every 
> child.
>
> I need to have IDs small like 8bits, co I probably can't use 
> typeid...
>
> Thank you for answer. Knowing that someting cannot be done is 
> better than spend on this another few hour.
>
> Great book btw.
>
> Ondra

Hello, here is another solution: a class ID is generated lazily, 
when queried
It does not recquire a static constructor.

----
module runnable;

static string[] IDs;

ptrdiff_t getClassID(ClassType)() if (is(ClassType == class))
{
     import std.algorithm;
     auto classTypeString = ClassType.stringof;
     ptrdiff_t result = countUntil(IDs, classTypeString);
     if (result == -1) {
         IDs ~= classTypeString;
         result = IDs.length -1;
     }
     return result;
}

void main(string[] args)
{
     class A{}
     class B{}
     class C{}
     class D{}

     assert(getClassID!A == 0);
     assert(getClassID!B == 1);
     assert(getClassID!C == 2);
     assert(getClassID!D == 3);
     assert(getClassID!C == 2);
     assert(getClassID!B == 1);
     assert(getClassID!A == 0);
}
----

Hoping it matches to your needs.


More information about the Digitalmars-d-learn mailing list