3

我需要生成可以用作D 编程语言中用户定义类型(结构或类)的唯一句柄的东西。最好这将是一个编译时可计算值。我希望句柄与类型的名称相关,并在类型的内部结构(数据布局)发生变化时进行更改,但对于大多数其他编辑(包括将相同类型编译到不同的应用程序)保持不变。

这不是一个安全的事情,所以它不需要很难绕过或任何东西

我目前的想法是使用带有类型名称和成员类型和名称的 MD5 哈希之类的字符串。

有什么想法吗

4

4 回答 4

1

考虑了一会儿,我认为这将是一种可行的方法(注意:这只是伪代码):

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)

也就是说,从类型的名称(您可能需要去掉模块和包,不确定)以及每个成员的类型的 ID、偏移量和名称构造唯一 ID。

根据您想要的内容,您可以删除成员名称。

于 2009-05-19T03:32:20.537 回答
1

类型的完全限定名称应该是唯一的。这与 typeid(T).toString 相同。这与T.stringof不同——T.stringof 将删除任何模板实例,并且不会给出完全限定的名称。

解决方法是在编译时使用 demangled(T.mangleof) 并在运行时使用 typeid(T).toString。

于 2009-05-23T11:13:55.820 回答
0

typeid表达式将返回 TypeInfo 对象的唯一实例。理论上,您应该能够使用 TypeInfo 对象的地址作为类型的唯一标识符值。

于 2009-05-18T22:49:32.290 回答
0

您知道,您可以将修订硬编码到类型中,例如“const REV = 173;”,然后在每次更改布局时更新它,然后将其与类型名称混合以生成您的标识符。

这有点麻烦,因为它需要手动更新,但是您可以编写脚本,以便在 svn diff 识别到该类中的更改时在提交时自动更新。这可能是最简单的解决方案。

于 2009-05-19T00:28:50.500 回答