У меня есть неограниченный общий тип Atomic, который реализует инициализатор (подробности в предыдущем вопросе ).
type
Atomic<T> = class
type TFactory = reference to function: T;
class function Initialize(var storage: T; factory: TFactory): T;
end;
Теперь я хочу написать упрощенную функцию Initialize, которая будет принимать информацию о типе из 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?