1
是否有添加類型特定的代碼德爾福泛型任何有效的方法? 例如是這樣的:如何添加特定類型的代碼,仿製藥在Delphi
function TGT<T>.GetSize(a: T): integer;
begin
{$IF TypeInfo(T)=TypeInfo(String)}
result := Length(A);
{$ELSE}
result := SizeOf(A);
{$IFEND}
end;
function TGT<T>.Compare(a,b: T): integer;
begin
{$IF TypeInfo(T)=TypeInfo(String)}
result := AnsiCompareText(a,b);
{$ELSE}
result := a-b;
{$IFEND}
end;
所以我需要實現根據類型不同方式的代碼的某些部分。 例如,如果我實現排序過程我想用整數/雙/等類型的值的直接比較(這是不是調用的接口方法,如德爾福的標準通用集裝箱做更有效)和功能AnsiCompareText爲字符串類型。
有一些例子,說明如何做到這一點,但它們都基於檢查是這樣的:在這裏
if TypeInfo(T)=TypeInfo(String) then xxx else if TypeInfo(T)=TypeInfo(Integer) then xxx
問題是,德爾福將檢查它只是運行時間,即(再次)不是這樣高效。 我想讓編譯器在編譯時進行所有檢查,並僅使用特定於所選類型的代碼。
我知道條件編譯並不能解決我的問題,我只是爲了說明而使用它。但我希望有另一種方式存在。在我看到的所有Delphi的泛型中,用於完成類型特定任務的接口。它看起來不像實體和清晰的概念,它看起來像是一種黑客或詭計。引入像泛型這樣強大的工具似乎很奇怪,但沒有能力提高代碼的效率。實際上,這意味着對於時間要求嚴格的任務,即使在像數據排序這樣的常見例程中,複製粘貼代碼而不是使用泛型也會更高效。 –
你確定在Generics.Defaults中使用泛型比較器接口真的很慢嗎?無論如何,泛型不是模板。它們本質上不如模板。 –
@David,我最近讀了很多關於「通用編譯階段」的文章。雖然這對我來說很有意義,但這是否記錄在某處? – iamjoosy