2009-05-18 47 views
3

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

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

我现在的想法是使用一个字符串的东西喜欢的类型名称的MD5哈希和成员类型和名称。

任何想法

回答

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,偏移量和名称。

根据您的具体情况,您可以删除成员名称。

+0

这或多或少是我的第一个想法,它会起作用。 (+1)OTOH我仍然希望有一些辉煌的解决方案。 – BCS 2009-05-19 06:12:13

0

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

+0

这有两个问题,它不适用于DLL,它不是编译时的值。 – BCS 2009-05-18 23:35:30

0

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

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

+0

这需要能够编辑类型。我不能指望我的情况。另外我会要求/我/用户这样做。 – BCS 2009-05-19 06:09:13

1

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

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

+0

有用!只要想一想,我想我可以使用它的碎片。它不会注意到成员的变化,但也可以这样做。 – BCS 2009-05-23 18:21:39

相关问题