У меня есть иерархия классов как эта:
class A { } //
class AA : A { } // A
class AAA : AA { } // / \
class AAB : AA { } // AA AB
class AB : A { } // / \ / \
class ABA : AB { } // AAA AAB ABA ABB
class ABB : AB { } //
Я хотел бы эмулировать RTTI (без его использования, конечно) для этой иерархии, таким образом, что, учитывая указатель/ссылку на A
, я могу узнать его фактический тип (аналогично тому, что typeid
is), как целое число, идентифицирующее класс.
Кроме того, мне хотелось бы, чтобы набор целых чисел, идентифицирующих мои типы, был смежным и от 0 до N-1 (от 0 до 6 в моем примере):
class A { virtual int t(){return 0;} } //
class AA : A { virtual int t(){return 1;} } // A(0)
class AAA : AA { virtual int t(){return 2;} } // / \
class AAB : AA { virtual int t(){return 3;} } // AA(1) AB(4)
class AB : A { virtual int t(){return 4;} } // / \ / \
class ABA : AB { virtual int t(){return 5;} } // AAA(2) AAB(3) ABA(5) ABB(6)
class ABB : AB { virtual int t(){return 6;} } //
(порядок не имеет значения: A::t
может возвращать 3 и AAB::t
0, например.
Можно ли дать компилятору присвоение индексов моим классам?
Я думаю, что CRTP мог бы помочь мне; что-то вроде:
class X : A, AssignFirstAvailableIndex< X > { }
но я недостаточно хорош с шаблонами. Как я мог реализовать этот класс шаблонов AssignFirstAvailableIndex
?
(конечно, компилятор может видеть все классы во время компиляции)