バリアントレコード内のメソッドを含めるための構文は何ですか?
-
18-09-2019 - |
質問
私は、次のレコード定義を持っている。
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;
これはコンパイルされません(関数は、関数の長さで、結果の型を必要とします)。明白なものは、私が間違ってやっている、またはこれはサポートされていませんか?その場合、配列として個々のフィールドにアクセスするためのエレガントでありながらパフォーマンスの道のための任意の提案ですか?
p.s。 E3FloatTはシングルのためのシンプルなタイプの別名である。
解決
多分それは、コンパイラでは見落としているが、それはメソッドがバリアントの一部の前に宣言されたときにコンパイルしません。これは、合理的な解決策を思わます。
E3Vector3T = packed record
public
function length: E3FloatT;
..
case boolean of
true: (
x: E3FloatT;
y: E3FloatT;
z: E3FloatT;
);
false: (
elements: packed array[0..2] of E3FloatT;
);
end;
他のヒント
このようなトップに関数宣言を移動
E3Vector3T = packed record
public
function length: E3FloatT;
case boolean of
true: (
x: E3FloatT;
y: E3FloatT;
z: E3FloatT;
);
false: (
elements: packed array[0..2] of E3FloatT;
);
end;
このは、Delphi 2010でコンパイルします。
所属していません StackOverflow