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