У меня есть иерархия классов, подобная этой:
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
), как целое число, идентифицирующее класс.
Более того, I ' Мне нравится, что набор целых чисел, идентифицирующих мои типы, является непрерывным и идет от 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
?
(конечно, компилятор может видеть все классы во время компиляции)