Числовой уникальный идентификатор класса через typeid

Оператор typeid в С++ возвращает объект класса std::type_info, который может дать свое текстовое имя. Тем не менее, мне просто интересно получить уникальный числовой идентификатор для любого полиморфного класса. (уникально в рамках одного запуска программы - не обязательно между прогонами)

На практике я мог просто разыменовать указатель и прочитать содержимое vptr, но это не было бы ни элегантным, ни портативным. Я предпочитаю переносимый способ.

Можно ли каким-либо образом использовать оператор typeid для "безопасного" численного идентификатора для класса? Например, могу ли я рассчитывать, что адрес результирующей структуры std::type_info будет одинаковым для каждого вызова typeid для данного класса? Или, возможно, указатель name()?

Ответ 2

std:: type_index (С++ 11) может использоваться в контейнерах для хранения значений на основе типа. Это не даст вам номер.

std::type_index index = std::type_index (typeid (int));

Подробнее: http://en.cppreference.com/w/cpp/types/type_index

Ответ 3

Тип_info имеет оператор ==() для сравнения типа, который он описывает, с типом другого объекта type_info. Объекты также гарантированно переживут программу.

Итак, если вы сохраните адреса двух типов type_infos, вы можете уйти с *p1 == *p2, чтобы узнать, относятся ли они к одному типу.

Ответ 4

статический элемент данных, который инициализируется алгоритмом, использующим счетчик? Затем используйте MyClass:: id как уникальный идентификатор. А затем используйте виртуальные функции для получения уникального идентификатора на основе базового класса. Гарантируется быть переносимым, но имеет небольшую нагрузку на обслуживание, поскольку вам необходимо реализовать как статическую переменную, так и реализовать виртуальную функцию для каждого нового класса, который вы создаете. Но предположим, что это не большая проблема, поскольку вы уже выбрали использование С++, который, как известно, является подробным. Это будет выглядеть так:

class Base { virtual int get_id() const=0; };
class Derived : public Base { static int id; int get_id() const { return id; } };
int algo() { static int count=0; count++; return count; }
static int Derived::id = algo();