Question

Je dois générer quelque chose qui peut être utilisé comme une poignée unique pour un type défini par l'utilisateur (struct ou classe) dans la section langage de programmation D . De préférence, ce serait une compilation valeur calculable. Je veux que la poignée se rapporte au nom du type ainsi que le changement si la structure interne (mise en page de données) des changements de type, mais restent les mêmes pour la plupart des autres modifications (y compris la compilation du même type dans une autre application).

Ce n'est pas une chose de sécurité donc il n'a pas besoin d'être difficile à contourner ou quoi que ce soit

Ma pensée actuelle est d'utiliser une chaîne avec quelque chose comme un hachage MD5 des types et des noms de type nom et membres.

Toutes les pensées

Était-ce utile?

La solution

Après avoir réfléchi à ce sujet pour un peu, je pense que ce serait une approche possible (note: ce code est juste 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)

C'est, construire l'ID unique du nom de type (vous devrez peut-être couper le module et l'emballage, pas sûr), et l'ID, l'offset et le nom de type de chaque membre.

Selon exactement ce que vous voulez, vous pouvez supprimer le nom du membre.

Autres conseils

Le nom complet d'un type doit être unique. Ceci est le même que typeid (T) .toString. Ceci est pas la même chose que T.stringof -. T.stringof effacera tous les instanciations de modèle et ne donnera pas le nom complet

La solution consiste à utiliser demangled (T.mangleof) à compiletime et typeid (T) .ToString à l'exécution.

Le typeid expression retournera une instance unique d'un TypeInfo objet. En théorie, vous devriez être en mesure d'utiliser l'adresse de l'objet TypeInfo comme valeur d'identifiant unique du type.

Vous savez, vous pouvez juste hardcode une révision dans le type, comme « REV const = 173; », puis mettre à jour chaque fois que vous changez la mise en page, puis mélanger cela avec le nom du type pour produire votre identifiant

est un peu embêtant car il nécessite des mises à jour manuelles, mais vous pouvez le script à être mis à jour automatiquement valider lorsque svn diff reconnaît un changement de cette classe. Et il est sans doute la solution la plus simple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top