2016-04-29 69 views
10

據爲Parametric Polymorphism維基百科頁面:爲什麼C++表示不支持參數多態?

型的多態性的一些實施表面上類似於參數多態同時還推出特設方面。一個例子是C++模板專業化。

問題:爲什麼C++來說,只有實現表面上類似於paramaterized多態性的東西嗎?特別是,模板不是一個完整的參數多態的例子嗎?

+0

不管這個問題的答案,那個維基百科頁面需要很多的愛... – Barry

+1

這個維基頁面來自理論的角度 - 嚴謹的數學規範的類型理論,因此,術語「參數多態性「有一個嚴格的定義。 C++模板比任何這樣的理論都能提供的更靈活...。因此......也許更有用!當然更多_有趣!無論如何,我一直聽說C++模板被描述爲「ad hoc多態性」。 – davidbak

回答

1

爲什麼C++說只實現一些表面上類似於參數化多態性的東西?特別是,模板不是一個完整的參數多態的例子嗎?

C++中的模板化函數基於參數的「替換」工作。這基本上意味着編譯器生成另一個版本的函數,其中模板參數被硬編碼到函數中。

假設在C有這種++:

template <typename T> 
T add(T a, T b) { 
    return a + b; 
} 

int main() { 
    int i = add(2, 3); 
    double d = add(2.7, 3.8); 
    return i + (int)d; 
} 

在編譯過程中,這將導致兩個功能:int add(int a, int b) { return a + b; }double add(double a, double b) { return a + b; } 一個功能將只處理整數,而另一個將只處理雙打。沒有多態性。

實際上,最終的實現方式與參數變化的數量一樣多。

但爲什麼不是這個參數多態?」你可能會問?

你需要'add'函數的完整源代碼,以便用你自己特定的變體來重載二進制'+'運算符! - 這是細節,使差異。如果C++具有適當的參數多態性,例如C#,那麼最終編譯的'add'實現將包含足夠的邏輯以在運行時確定對於'add'可接受的任何給定參數的'+'重載。而且你不需要該函數的源代碼,就可以用你發明的新類型來調用它。

這是什麼意思?

但是不明白這一點,就好像C++不那麼強大或者C#更強大。這只是許多語言功能細節之一。

如果您的模板化函數具有完整的源代碼,那麼C++的語義要優越得多。如果您只有一個靜態或動態庫可供您使用,那麼參數化多態實現(例如C#)會更好。

1

您鏈接的文章解釋了這一點。你所引用的文本實際上給出了一個例子,它將C++的模板從純粹的參數多態性中分離出來:C++模板特化。

它繼續了這一主題:

繼克里斯托弗斯特雷奇,[2]參數多態性可與ad hoc polymorphism,其中單個多態函數可以具有取決於多個不同的和潛在的異質實現的對比對其適用的論點類型進行分析。因此,ad hoc多態性通常只能支持有限數量的這種不同類型,因爲必須爲每種類型提供單獨的實現。

因此,如上所述,C++模板接近於—,但並不完全是—參數多態性。