Как я могу генерировать плотные уникальные идентификаторы типов во время компиляции?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу генерировать плотные уникальные идентификаторы типов во время компиляции?

Сообщение Anonymous »

Я пытаюсь создать систему классов, которые представляют собой небольшие объекты, и у базового класса есть член, который является уникальным идентификатором, идентифицирующим класс:

Код: Выделить всё

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;
};
С помощью идентификатора класса я просматриваю вектор Shape * и включаю идентификатор, видимый в базовом классе, а затем статическое приведение для различного поведения (к треугольнику, квадрату или ShapeBox и дочерние фигуры, содержащиеся в нем соответственно для примера иерархии классов)

Я мог бы включить 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;
В идеале мне нужны плотные, уникальные идентификаторы типов, доступные во время компиляции, чтобы компилятор мог работать хорошо, например, преобразование переключения идентификаторов типов в постоянный скачок во времени. таблица или, по крайней мере, двоичное дерево поиска, а не линейная по времени цепочка if/else для того, что может быть длинным списком идентификаторов типов...

Я могу использовать шаблон во время компиляции, чтобы вручную назначить каждый идентификатор типа, или я могу использовать указатели на объекты/функции из аналогичного класса идентификатора типа. Стандартный шаблон гарантированно будет плотным (поскольку мы назначаем его вручную) и известен во время компиляции, но его невозможно поддерживать для типов шаблонов. Всякий раз, когда вы добавляете тип шаблона в фигуру, вам придется вручную добавлять новый тип. Монотонный статический счетчик удобен в обслуживании и плотен, но неизвестен во время компиляции, поэтому оптимизация времени компиляции невозможна, а безопасность потоков может вызывать беспокойство. Идентификатор указателя функции известен во время компиляции и его можно поддерживать, но он не является плотным и не помещается в небольшой тип идентификатора, например char.

Есть ли какой-нибудь способ генерировать идентификаторы типов, которые видны компилятору во время компиляции, плотны и автоматически назначаются, возможно, с использованием счетчика метапрограммирования шаблонов или какой-то магии препроцессора в C++11 или C++14? Или это невозможно, пока в C++ не будет отражения времени компиляции?

Подробнее здесь: https://stackoverflow.com/questions/265 ... mpile-time
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»