如何在D中唯一标识用户定义的类型?

时间:2009-05-18 22:39:07

标签: hash metaprogramming d

我需要生成一些可以用作D programming language中用户定义类型(结构或类)的唯一句柄的东西。优选地,这将是编译时可计算值。我希望句柄与类型的名称相关,并且如果类型的内部结构(数据布局)发生更改,则更改,但对于大多数其他编辑保持相同(包括将相同类型编译到不同的应用程序中)。

这不是一个安全问题,因此不需要很难绕过任何东西

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

任何想法

4 个答案:

答案 0 :(得分: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,偏移量和名称。

根据您的需要,您可以删除会员名称。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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