3

D プログラミング言語でユーザー定義型 (構造体またはクラス) の一意のハンドルとして使用できるものを生成する必要があります。これは、コンパイル時に計算可能な値であることが望ましいです。ハンドルを型の名前に関連付け、型の内部構造 (データ レイアウト) が変更された場合に変更する必要がありますが、他のほとんどの編集では同じままです (同じ型を別のアプリにコンパイルすることを含む)。

これはセキュリティの問題ではないため、バイパスするのが難しい必要はありません。

私の現在の考えは、型名とメンバーの型と名前の MD5 ハッシュのような文字列を使用することです。

何かご意見は

4

4 に答える 4

1

タイプの完全修飾名は一意である必要があります。これはtypeid(T).toStringと同じです。これはT.stringofと同じではありません-T.stringofはテンプレートのインスタンス化を消去し、完全修飾名を付けません。

回避策は、コンパイル時にdemangled(T.mangleof)を使用し、実行時にtypeid(T).toStringを使用することです。

于 2009-05-23T11:13:55.820 に答える
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 に答える
0

「const REV = 173;」のように型にリビジョンをハードコーディングし、レイアウトを変更するたびにそれを更新し、それを型名と組み合わせて識別子を生成することができます。

手動で更新する必要があるため、これは少し面倒ですが、svn diff がそのクラスの変更を認識したときに、コミット時に自動的に更新されるようにスクリプトを作成できます。そして、それはおそらく最も簡単な解決策です。

于 2009-05-19T00:28:50.500 に答える
0

typeid 式は、TypeInfo オブジェクトの一意のインスタンスを返します。理論的には、TypeInfo オブジェクトのアドレスを型の一意の識別子の値として使用できるはずです。

于 2009-05-18T22:49:32.290 に答える