Сортировка времени компиляции по типам

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

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

компилятор не имеет возможности знать все единицы компиляции, и компоновщик не имеет понятия типа

В самом деле, задача для компилятора была бы значительной: он должен убедиться, что в любом вызове для любого исходного файла он возвращает одно и то же целое число для данного типа /, он возвращает тот же порядок между любыми двумя заданными типами, но в то же время вселенная типов открыта и не знает никаких типов за пределами текущего файла. Жесткая проблема.

Идея, которую я имел, это то, что типы имеют имена. И по законам С++, насколько я знаю, полное имя типа должно быть уникальным для всей программы, иначе вы получите ошибки или поведение undefined того или иного типа.

  • Если два типа имеют одинаковое имя, то они одного типа.

  • Если два типа одного типа, то либо они имеют одно и то же имя, либо они являются typedefs для друг друга. Компилятор имеет полное знание typedefs.

Имена - это строки, а строки имеют порядок. Поэтому, если у меня все будет правильно, вы можете определить глобально согласованный порядок по типам на основе их имен. Более конкретно, упорядочение между любыми двумя типами будет упорядочением между именами типов с полностью разрешенными typedefs. (Наличие типа ведет себя иначе, чем его typedefs будет проблематичным.)

Конечно, стандартный С++ не имеет средств для поиска имен типов.

Мои вопросы:

  • Есть ли у меня что-то не так? Существуют ли какие-либо причины, по которым теоретически это не будет работать?

  • Существуют ли какие-либо компиляторы, которые дают вам доступ к именам типов (и в идеале их форм, разрешенных с помощью typedef) во время компиляции в качестве расширения языка?

  • Есть ли другой способ сделать это? Есть ли компиляторы, которые делают?

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

1 ответ

полное имя типа должно быть уникальным для всей программы

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

Единственный смысл, в котором я знаю, что у них действительно есть разные имена, - это искаженные символы линкера; вы можете (в зависимости от компилятора) получить это от type_info::name(), но это не гарантировано, ограничено типами с RTTI и в любом случае не представляется объявленным как constexpr, поэтому вы можете ' t используйте значение во время компиляции.

Упорядочение, созданное type_info::before(), естественно, имеет те же ограничения.

Из интереса, чего вы пытаетесь достичь с помощью упорядочивания типа компиляции?

licensed under cc by-sa 3.0 with attribution.