Domanda

Ho bisogno di generare qualcosa che può essere utilizzato come un manico unico per un tipo definito dall'utente (struct o classe) nel D linguaggio di programmazione . Preferibilmente questo sarebbe un valore calcolabile fase di compilazione. Voglio che il manico di relazionarsi con il nome del tipo così come cambiare se la struttura interna (layout dei dati) del tipo cambiamenti, ma resta lo stesso per la maggior parte delle altre modifiche (tra cui la compilazione dello stesso tipo in un'altra applicazione).

Questa non è una cosa di sicurezza in modo che non ha bisogno di essere difficile da aggirare o nulla

Il mio pensiero attuale è quella di utilizzare una stringa con qualcosa come un hash MD5 del nome del tipo e membro tipi e nomi.

Ogni pensiero

È stato utile?

Soluzione

Dopo aver riflettuto su questo per un po ', credo che questo sarebbe un approccio praticabile (nota: questo è solo il codice pseudo):

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)

Cioè, costruire l'ID univoco dal nome del tipo (potrebbe essere necessario recidere il modulo e il pacchetto, non è sicuro), e l'ID del tipo di ciascun membro, offset e il nome.

A seconda del esattamente ciò che si vuole, è possibile rimuovere il nome del membro.

Altri suggerimenti

Il nome completo di un tipo deve essere univoco. Questo è lo stesso come typeid (T) .toString. Si tratta di non lo stesso T.stringof -. T.stringof cancellerà eventuali istanze di modello e non darà il nome completo

La soluzione è utilizzare demangled (T.mangleof) a compiletime e typeid (T) .ToString in fase di esecuzione.

Il typeid espressione restituirà un'istanza unica di un TypeInfo oggetto. In teoria, si dovrebbe essere in grado di utilizzare l'indirizzo dell'oggetto TypeInfo come valore di identificatore univoco del tipo.

Non si sa, si può semplicemente hardcode una revisione nel tipo, come "REV const = 173;", quindi aggiornarla ogni volta che si modifica il layout, quindi mescolare che con il nome del tipo di produrre l'identificatore

Questo è un po 'di fastidio perché richiede aggiornamenti manuali, ma si potrebbe lo script di essere aggiornato automaticamente on commettere quando svn diff riconosce un cambiamento in quella classe. Ed è probabilmente la soluzione più semplice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top