Как я тестирую универсальную переменную типа на равенство со Значением по умолчанию (T) в Delphi?

Гну Научная Библиотека (GSL) имеет довольно обширный набор генераторов RN, тестовой обвязки, и т.д. Если Вы находитесь на Linux, это, вероятно, уже доступно в Вашей системе.

6
задан Oliver Giesen 7 January 2010 в 10:30
поделиться

3 ответа

После подсказки в комментариях от Биниса и небольшого покопания в 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;
11
ответ дан 9 December 2019 в 22:36
поделиться

Насколько я понимаю, похоже, что вы хотите выполнить какую-то функцию мемоизации. Если это так, просто прочтите эту статью

http://blogs.teamb.com/craigstuntz/2008/10/01/37839/

1
ответ дан 9 December 2019 в 22:36
поделиться

Проблема не в функции по умолчанию , а в операторе равенства = .

Вы можете ограничить 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;   
-1
ответ дан 9 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: