Я искал способ получить заказ по типам во время компиляции. Это было бы полезно, например, для реализации (эффективных) наборов типов времени компиляции.Сортировка времени компиляции по типам
Одним из очевидных способов сделать это было бы, если бы был способ сопоставить каждый тип с уникальным целым числом. Ответ на previous question по этой теме лаконично захватывает, почему это трудно, и кажется, что было бы в равной степени применим к любому другому способу пытаться получить заказ:
компилятора не имеют возможностей узнать все единицы компиляции и компоновщик не имеет понятия типа
Действительно, задача компилятора будет значительной: он должен убедиться в том, что в любом вызове, для любого исходного файла, он возвращает то же число для данного типа/он возвращает одинаковое упорядочение между любыми двумя заданными типами, но в то же время универсальный тип типов открыт и не знает никаких типов за пределами текущего файла. Жесткая проблема.
Идея, которую я имел, состоит в том, что типы имеют имена. И по законам C++, насколько я знаю, полное имя типа должно быть уникальным для всей программы, иначе вы получите ошибки или неопределенное поведение того или иного типа.
Если два типа имеют одинаковое имя, то они одного типа.
Если два типа одного типа, то либо они имеют одно и то же имя, либо они являются typedefs для друг друга. Компилятор имеет полное знание typedefs.
Имена - это строки, а строки имеют порядок. Поэтому, если у меня все будет правильно, вы можете определить глобально согласованный порядок по типам на основе их имен. Более конкретно, упорядочение между любыми двумя типами будет упорядочением между именами типов с полностью разрешенными typedefs. (Наличие типа по-разному отличается от его typedefs будет проблематичным.)
Конечно, стандартный C++ не имеет средств для получения имен типов.
Мои вопросы:
Есть ли у меня что-то не так? Существуют ли какие-либо причины, по которым теоретически это не будет работать?
Есть ли какие-либо компиляторы, которые дают вам доступ к именам типов (и в идеале их формам, разрешенным для typedef) во время компиляции в качестве расширения языка?
Есть ли другой способ, которым это можно было бы сделать? Есть ли компиляторы, которые делают?
(я признаю, что это не вежливо просить больше, чем один вопрос в том же самом вопросе, но это казалось странным размещать три отдельные вопросы с теми же основными горловыми очистками предыдущих их.)
Я подозреваю, что вы используете неправильный язык программирования. –
(И, FWIW, я думаю, что ваша группировка вопросов, вероятно, прекрасна в этом случае. Они плотно последовательны.) –
«Конечно, стандартный C++ не имеет средств для поиска имен типов». - http://en.wikipedia.org/wiki/Typeid – FailedDev