次のレコード定義があります
E3Vector3T = packed record
public
x: E3FloatT;
y: E3FloatT;
z: E3FloatT;
function length: E3FloatT;
function normalize: E3Vector3T;
function crossProduct( const aVector: E3Vector3T ): E3Vector3T;
class operator add( const aVector1, aVector2: E3Vector3T ): E3Vector3T;
class operator subtract( const aVector1, aVector2: E3Vector3T ): E3Vector3T;
class operator negative( const aVector: E3Vector3T ): E3Vector3T;
class operator multiply( const aVector: E3Vector3T; const aScalar: E3FloatT ): E3Vector3T;
class operator divide( const aVector: E3Vector3T; const aScalar: E3FloatT ): E3Vector3T;
end;
私がやりたかったのは、バリアント レコード パーツを導入して、3 つの要素に個別に、または配列としてアクセスできるようにすることです。つまり、
E3Vector3T = packed record
public
case boolean of
true: (
x: E3FloatT;
y: E3FloatT;
z: E3FloatT;
);
false: (
elements: packed array[0..2] of E3FloatT;
);
function length: E3FloatT;
..
end;
これはコンパイルされません (関数には関数の長さで結果の型が必要です)。私が間違っていることは明らかですか、それともサポートされていませんか? その場合、個々のフィールドに配列としてアクセスするエレガントでパフォーマンスの高い方法についての提案はありますか?
ps E3FloatT は、Single の単純な型エイリアスです。