2009-05-18 74 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

相關問題