代码之家  ›  专栏  ›  技术社区  ›  BCS

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

  •  3
  • BCS  · 技术社区  · 16 年前

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

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

    有什么想法吗

    4 回复  |  直到 16 年前
        1
  •  1
  •   DK.    16 年前

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

    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。

        2
  •  1
  •   user38001    16 年前

    与T.stringof相同——T.stringof将删除任何模板实例化,并且不会给出完全限定名。

        3
  •  0
  •   Vladimir Panteleev    16 年前

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

        4
  •  0
  •   FeepingCreature    16 年前

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

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