解决方法
我知道以下无证件的内在功能.
德尔福2007:here和Hallvard’s blog:
默认
function Default(T: Typeidentifier): value of T;
返回类型标识符T的零表示.
下面介绍了XE7中介绍的内在的in the XE7 beta blog和Stefan Glienke
IsManagedType
function IsManagedType(T: TypeIdentifier): Boolean;
如果T是接口,字符串或动态数组,或包含此类记录的记录,则为真.包含托管类型的类将返回false.
HasWeakRef
function HasWeakRef(T: TypeIdentifier): Boolean;
不确定它是做什么的,它只能在NextGen编译器中有用.
GetTypeKind
function GetTypeKind(T: TypeIdentifier): TTypeKind;
与PTypeInfo(System.TypeInfo(T))^.类似,但是因为它是一个编译器,内在的函数在compiletime中解析,并且评估为false的条件代码将被编译器剥离.
IsConstValue
function IsConstValue(const Value): Boolean;
如果Value是常数,则为True,否则为false.
这有助于编译器消除死代码,因为在编译时对该函数进行了评估.
这只适用于内联函数,它允许较短的生成代码.
所属类别
function TypeInfo(T: typeindentifier): PTypeInfo;
这个函数不是没有这样的文档,但是没有证明的是XE7是一个内在函数.
这意味着如果TypeInfo(T)= TypeInfo(byte)then …不会生成任何代码,如果T不是一个字节,并且测试将在compiletime解析,那么代码段.
但是,编译时解决方案仅在通用例程中工作,并且仅在执行if(TypeInfo(T)= TypeInfo(sometype))测试时才起作用.
测试如果TypeInfo(byte)= TypeInfo(smallint)然后不会被消除,即使它总是评估为false.
也不会使用TypeInfo(T).
退货地址
在returnaddress构造中使用以下引发异常.
function ReturnAddress(Expression): pointer; //Delphi ? function AddressOfReturnAddress(Expression): pointer; //Delphi ?
IsConstValue的示例
type TFlavor = (Tasty,Nasty); TIntegerHelper = record helper for integer function GetSomething(Flavor: TFlavor): TPoint; inline; private function GetTastyPoint: TPoint; function GetNastyPoint: TPoint; end; function TIntegerHelper.GetSomething(Flavor: TFlavor): TPoint; begin if IsConstValue(Flavor) then begin if Flavor = Tasty then Result:= Self.GetTastyPoint else Result:= Self.GetNastyPoint; end else begin Assert(1=0,'This function can only be called with constant parameters'); end; end; procedure Test; var pt: TPoint; begin pt:= 100000.GetSomething(Tasty);