2013-07-07 56 views
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 

問題是,德爾福將檢查它只是運行時間,即(再次)不是這樣高效。 我想讓編譯器在編譯時進行所有檢查,並僅使用特定於所選類型的代碼。

回答

1

嗯,你當然不能希望做這樣的與條件編譯任何東西。請記住,泛型的條件編譯是在通用編譯階段處理的,而不是在實例化階段。所以你不能指望用你的條件語句的不同分支來編譯不同的實例。

而且您肯定無法讓編譯器接受Length(a),其中a的類型是參數化的,因爲沒有辦法指定允許使用Length的約束。

唯一的選擇是一個運行時檢查。

+0

我知道條件編譯並不能解決我的問題,我只是爲了說明而使用它。但我希望有另一種方式存在。在我看到的所有Delphi的泛型中,用於完成類型特定任務的接口。它看起來不像實體和清晰的概念,它看起來像是一種黑客或詭計。引入像泛型這樣強大的工具似乎很奇怪,但沒有能力提高代碼的效率。實際上,這意味着對於時間要求嚴格的任務,即使在像數據排序這樣的常見例程中,複製粘貼代碼而不是使用泛型也會更高效。 –

+0

你確定在Generics.Defaults中使用泛型比較器接口真的很慢嗎?無論如何,泛型不是模板。它們本質上不如模板。 –

+0

@David,我最近讀了很多關於「通用編譯階段」的文章。雖然這對我來說很有意義,但這是否記錄在某處? – iamjoosy