Pau*_*Jan 9 delphi record variant delphi-2010
我有以下记录定义
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;
Run Code Online (Sandbox Code Playgroud)
我想要做的是引入一个变体记录部分,以便能够单独和作为一个数组访问这三个元素,即
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;
Run Code Online (Sandbox Code Playgroud)
这不会编译(函数需要函数长度的结果类型).有什么明显我做错了,还是不支持?在这种情况下,任何建议以优雅而高效的方式访问单个字段作为数组?
ps E3FloatT是Single的简单类型别名.
也许它是编译器中的疏忽,但是当在变量部分之前声明方法时它会编译.这似乎是合理的解决方案.
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;
Run Code Online (Sandbox Code Playgroud)
将函数声明移动到顶部,如下所示:
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;
Run Code Online (Sandbox Code Playgroud)
这在Delphi 2010中编译.
| 归档时间: |
|
| 查看次数: |
616 次 |
| 最近记录: |