Гну Научная Библиотека (GSL) имеет довольно обширный набор генераторов RN, тестовой обвязки, и т.д. Если Вы находитесь на Linux, это, вероятно, уже доступно в Вашей системе.
После подсказки в комментариях от Биниса и небольшого покопания в Generics.Collections я пришел к следующему, который, похоже, работает именно так, как я хотел:
function TMyClass.GetProp<T>(var ADataValue: T; const ARetriever: TFunc<T>): T;
var
lComparer: IEqualityComparer<T>;
begin
lComparer := TEqualityComparer<T>.Default;
if lComparer.Equals(ADataValue, Default(T)) then
ADataValue := ARetriever();
Result := ADataValue;
end;
Насколько я понимаю, похоже, что вы хотите выполнить какую-то функцию мемоизации. Если это так, просто прочтите эту статью
Проблема не в функции по умолчанию
, а в операторе равенства =
.
Вы можете ограничить T
до IEquatable
и используйте метод Equals
следующим образом:
TMyClass = class
function GetProp<T : IEquatable<T>>(var ADataValue: T; const ARetriever:
end;
...
function TMyClass.GetProp<T>(var ADataValue: T; const ARetriever: TFunc<T>): T;
begin
if ADataValue.Equals (Default(T)) then
ADataValue := ARetriever();
Result := ADataValue;
end;