Назначение уникального интегрального идентификатора для типов, время компиляции

Интересно, позволяет ли какое-то средство метапрограммирования шаблонов назначать уникальные интегральные идентификаторы для разных типов, то есть что-то вроде этого:

class Type;
enum { id = identifier<type>() /* or identifier<type>::id, ... */ };
static_assert(id == identifier<type>(), "...");
</type></type></type>

Жесткая часть, я думаю, состоит в том, что идентификатор должен оставаться неизменным в одной компиляции (что не обязательно совпадает с единицей компиляции). Но, конечно, поскольку я не знаю техники или, если это вообще возможно, я действительно не знаю, какая самая сложная часть.

Изменить: Как в одном модуле компиляции?

2 ответа

Взгляните на Modern С++ Design от Andrei Alescandrescu. Он довольно глубоко анализирует эту проблему, активно участвуя в метапрограмме шаблонов, в одной из глав об абстрактных фабриках. Вывод состоит в том, что нет абсолютно портативного способа сопоставления типа С++ с интегральным типом.


Вы можете использовать typeid во время выполнения для классов с виртуальными функциями.

Другие типы не имеют необходимого представления и глобального порядка, компилятор не имеет возможности знать все единицы компиляции, а компоновщик не имеет понятия типа. Наиболее распространенным решением является использование Boost.MPL для создания вектора всех интересных типов и использования индекса в этом векторе в качестве идентификатора.

licensed under cc by-sa 3.0 with attribution.