2009-04-29 6 views
2

Est-il possible de déterminer la taille en octets de quelque chose commeTaille du type générique

TItem <T> = record 
    Data : T; 
end; 

Puis-je écrire quelque chose comme

function TItem <T>.GetByteSize : Integer; 
begin 
if (T = String) then 
    Result := GetStringByteSize (Data as String) 
else 
    Result := SizeOf (Data); 
end; 

ou peut-être avec l'aide de spécialisation?

function TItem <String>.GetByteSize : Integer; 
begin 
    Result := GetStringByteSize (Data) 
end; 

function TItem <T>.GetByteSize : Integer; 
begin 
    Result := SizeOf (Data); 
end; 

Merci!

Répondre

0

Non, vous ne pouvez pas se spécialiser en fonction du type autant que je sache

2

Y at-il quelque chose de mal à prendre la taille du type instancié?

SizeOf(TItem<string>) 

Ou vous pouvez définir GetByteSize comme ceci:

function TItem <T>.GetByteSize : Integer; 
begin 
    Result := SizeOf(TItem<T>); 
end; 
+0

Je veux GetByteSize pour retourner la taille en octets de l'objet, y compris la taille des membres de données, à savoir T = String, je veux quelque chose comme "SizeOf (Data) + Length (Data) * SizeOf (Char) + 4" – jpfollenius

+2

C'est une question très différente, et n'est pas spécifique aux génériques. Les problèmes pour essayer de calculer le type de taille récursive dont vous parlez sont les cycles (pour les références d'objet) et le partage. Pour T = String, par exemple, vous (a) devriez ajouter 12, pas 4 (codePage: 2, elemSize: 2, refCnt: ​​4, longueur: 4), et (b) que faire si la chaîne est partagée (refCnt> 1)? –

+0

Je sais que c'est en général un problème très difficile (j'ai posté une question à ce sujet avant), mais je veux seulement ce scénario spécial, où String est le seul type qui nécessite un traitement supplémentaire (pour tous les autres types utilisez SizeOf). J'ai décidé de voir le partage comme une optimisation et de calculer une "taille de casse". – jpfollenius

Questions connexes