C ++: эмуляция RTTI

У меня есть иерархия классов, подобная этой:

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 ?

(конечно, компилятор может видеть все классы во время компиляции)

10
задан peoro 4 December 2010 в 11:46
поделиться