Я пытаюсь создать систему классов, которые являются маленькими объектами, а базовый класс имеет член, который является уникальным идентификатором, который идентифицирует класс:
class Shape
{
public:
unsigned char id;
};
template <typename T>
class Triangle : public Shape
{
T triangle_data;
};
template <typename T>
class Square : public Shape
{
T square_data;
};
template <typename T>
class ShapeBox : public Shape
{
T shapebox_data;
Shape * child_shape;
};
С идентификатором класса я просматриваю вектор Shape * и переключаю идентификатор, видимый в базовом классе, а затем статический приведение для различного поведения (в треугольник, квадрат или ShapeBox и дочерние фигуры, удерживаемые в нем соответственно для пример иерархии классов)
Я могу включить RTTI, но стоимость пространства кажется довольно большой, особенно когда информация о типе может быть реализована как указатель, а размер объекта может быть не больше пары байтов. Могут быть миллионы мелких объектов, и мне действительно нужен статический литье в любом случае.
В настоящее время я могу сделать идентификаторы типов с помощью статики, которым назначены значения из статического монотонно увеличивающего счетчика:
class TypeID
{
static size_t counter;
public:
template<typename T>
static size_t value()
{
static size_t id = counter++;
return id;
}
};
size_t TypeID::counter = 1;
В идеале я хочу иметь плотный уникальный идентификатор типа, доступный во время компиляции, поэтому компилятор может хорошо работать, например, преобразовывать переключатель в идентификаторы типов в таблицу с постоянным временем перехода или, по крайней мере, двоичное дерево поиска, а не линейное время, если /else цепь для того, что может быть длинным списком идентификаторов типов...
Я могу использовать шаблон во время компиляции, чтобы вручную назначать каждый идентификатор типа, или я могу использовать указатели объектов/функций из аналогичного типа. Пластинчатая плита гарантированно плотна (потому что мы ее назначаем вручную) и известна во время компиляции, но она не может быть использована для типов шаблонов. Всякий раз, когда вы добавляете тип шаблона в фигуру, вам необходимо вручную добавить новый тип. Монотонический статический счетчик является поддерживаемым и плотным, но неизвестным во время компиляции, и поэтому оптимизация времени компиляции невозможна, и проблема безопасности потоков может быть проблемой. Идентификатор указателя функции известен во время компиляции и поддерживается, но не является плотным и не будет вписываться в небольшой тип id, такой как char.
Есть ли способ генерировать идентификаторы типов, видимые компилятору во время компиляции, плотные и автоматически назначаемые, возможно, используя счетчик метапрограмм шаблонов или некоторую магию препроцессора в С++ 11 или С++ 14? Или это невозможно, пока С++ не компилирует временное отражение?