我有无约束的泛型类型Atomic,它实现了一个初始化器(详见我的previous question)。基于不受约束的泛型类型创建对象实例
type
Atomic<T> = class
type TFactory = reference to function: T;
class function Initialize(var storage: T; factory: TFactory): T;
end;
现在我想写简化这将需要在T型信息(前提是typeof运算(T)是tkClass),并创建新的实例(必要时)使用默认的构造函数初始化函数。
可悲的是,这种失败:
class function Atomic<T>.Initialize(var storage: T): T;
begin
if not assigned(PPointer(@storage)^) then begin
if PTypeInfo(TypeInfo(T))^.Kind <> tkClass then
raise Exception.Create('Atomic<T>.Initialize: Unsupported type');
Result := Atomic<T>.Initialize(storage,
function: T
begin
Result := TClass(T).Create; // <-- E2571
end);
end;
end;
编译器报错E2571 Type parameter 'T' doesn't have class or interface constraint
。
我该如何欺骗编译器来创建类T的实例?
谢谢,但XE2 Update 2问题的核心是如果T没有标记'class'约束,则TypeInfo(T)将不会编译。 – gabr
不知道这个。这是一个“功能”还是一个错误? – Linas
我不确定,但恐怕这是一个功能。 – gabr