Назначение уникального интегрального идентификатора для типов, время компиляции - PullRequest
1 голос
/ 13 ноября 2011

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

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

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

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

Ответы [ 2 ]

1 голос
/ 13 ноября 2011

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

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

0 голосов
/ 13 ноября 2011

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

...