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

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

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

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

Редактировать: Как насчет внутри одного модуля компиляции?

2 ответа

Решение

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

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

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

Другие вопросы по тегам