Как однозначно определить пользовательский тип в D? - PullRequest
3 голосов
/ 19 мая 2009

Мне нужно сгенерировать что-то, что может быть использовано в качестве уникального дескриптора для определенного пользователем типа (структура или класс) в D языке программирования . Предпочтительно это будет вычисляемое значение времени компиляции. Я хочу, чтобы дескриптор относился к имени типа, а также изменялся, если внутренняя структура (макет данных) типа изменяется, но остается такой же для большинства других правок (включая компиляцию того же типа в другое приложение). *

Это не вопрос безопасности, поэтому его не нужно сложно обходить или что-то в этом роде

Моя текущая мысль - использовать строку с чем-то вроде хэша MD5 типа name, а также типов и имен членов.

Любые мысли

Ответы [ 4 ]

1 голос
/ 23 мая 2009

Полное имя типа должно быть уникальным. Это то же самое, что typeid (T) .toString. Это , а не , то же самое, что и T.stringof - T.stringof удалит все экземпляры шаблона и не даст полное имя.

Обходной путь должен использовать demangled (T.mangleof) во время компиляции и typeid (T) .toString во время выполнения.

1 голос
/ 19 мая 2009

Подумав немного об этом, я думаю, что это был бы осуществимый подход (примечание: это просто псевдокод):

UniqueId(Type) = Type.stringof ~ MemberIds!(Type.tupleof)

UniqueId(Type) if( Type is builtin ) = Type.stringof

MemberIds(M, Ms...) = "," ~ UniqueId!(typeof(M))
                      ~ "@" ~ ToString!(M.offsetof)
                      ~ ":" ~ M.stringof
                      ~ MemberIds!(Ms)

То есть создайте уникальный идентификатор из имени типа (вам может потребоваться отрубить модуль и пакет, не уверен), а также идентификатор каждого члена, смещение и имя.

В зависимости от того, что именно вы хотите, вы можете удалить имя участника.

0 голосов
/ 19 мая 2009

Знаете, вы можете просто жестко закодировать ревизию в типе, например "const REV = 173;", затем обновлять ее каждый раз, когда вы меняете макет, а затем смешивать ее с именем типа, чтобы получить свой идентификатор.

Это немного хлопотно, потому что требует ручного обновления, но вы можете написать скрипт для автоматического обновления при коммите, когда svn diff распознает изменение в этом классе. И это, наверное, самое простое решение.

0 голосов
/ 19 мая 2009

Выражение typeid возвращает уникальный экземпляр объекта TypeInfo. Теоретически вы должны иметь возможность использовать адрес объекта TypeInfo в качестве значения уникального идентификатора типа.

...