Присвоение уникального интегрального идентификатора типам во время компиляции

#c #compile-time

#c #время компиляции

Вопрос:

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

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

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

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

Комментарии:

1. Конечно. Как говорится, все идет своим чередом.

2. Есть ли возможное решение? Чтобы быть уникальным, им следует управлять через модули компиляции, что делает невозможным выполнение во время компиляции. Однажды мне понадобилось подобное средство, но я не смог его найти.

3. @user1030861: хотя, если вы используете обычный компилятор, опции и ABI, вы, вероятно, прошли бы долгий путь с сильным хэшем typeid(T).name() . Вы наверняка вышли бы за рамки стандартов , но это может сработать

4. @user1030861 — Мне было интересно использовать typeid для известного фиксированного типа в constexpr функции, но, похоже, это незаконно

Ответ №1:

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

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

Ответ №2:

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