2
A
回答
6
它們實際上以非常不同的方式實施。在C++中,模板在編譯時專用,而.Net泛型在運行時專用。
換句話說,類似MyClass<A> a
這樣的C++代碼會導致編譯器執行模板參數替換,併爲該類生成二進制文件,就像在編譯時它是普通類一樣。
這裏就是我的意思是:
template<typename T>
class MyClass
{
public:
void Foobar(const T& a);
};
int main()
{
MyClass<int> myclass;
return 0;
}
這被編譯成這樣的:
class MyClass_int // hypothetical class generated by compiler
{
public:
void Foobar(const int& a);
};
int main()
{
MyClass_int myclass;
return 0;
}
所以模板「不存在」,在出現的編譯的C++代碼的二進制代碼。
在.Net中,同一行會導致編譯器爲該類發出元數據,表明在運行時應該替換泛型類型參數。實際上它並不像聽起來那麼糟糕,因爲JIT編譯器應該能夠巧妙地處理它們。
public class MyClass<T>
{
public void Foobar(T item) {}
}
這是與額外的信息,表明它是一個泛型類編譯。該T
參數在運行時填充的時候才使用:
// This specialization occurs at runtime
MyClass<int> myclass = new MyClass<int>();
的.Net仿製藥不要試圖複製所有的C++模板功能。 C++模板功能明顯更強大,但代價是工作難度更大(C++模板實際上是Turing-complete)。
1
看待它的一種方法是模板擴展發生在編譯時,但泛型是.Net中的運行時功能。
該C#常見問題有一個good article和採訪鏈接,超越了一些差異。
相關問題
- 1. C++模板 - 基礎知識
- 2. C#泛型如何實現?
- 3. 繼承/泛型基礎知識。如何實現代碼結構DRY
- 4. C++模板和C#泛型
- 5. Java泛型vs C++模板
- 6. java泛型和c + +模板
- 7. C++模板到Java泛型
- 8. Java泛型與C++模板
- 9. C#實現泛型IEnumerable
- 10. 如何在Swift中使用泛型實現「C++ - ish模板特化」?
- 11. 泛型:如何實現:
- 12. 如何用泛型基類定義protobuf-net模型?
- 13. 類似於C++模板中的C#泛型類型演繹?
- 14. 如何在C++模板中實現相當於Java泛型自我界限的類型
- 15. .NET C#:如何實現基於角色的登錄和實現在C#.net實體框架
- 16. 如何爲泛型類型實現equals?
- 17. .NET ICollection類基礎知識
- 18. C# - 如何基於泛型將採取行動的實例推斷使用哪個泛型實例?
- 19. C++ - 如何實現模板類
- 20. C++模板 - 具有模板類型的泛型方法
- 21. C++模板基於模板參數
- 22. 與非泛型實現泛型類型
- 23. 基於模板參數C++模板函數返回類型
- 24. C++基礎知識
- 25. Python的Django模型的基本知識
- 26. 實現基於Arraylist的Bag/Multiset-卡在泛型上
- 27. C#哪裏有模板/泛型
- 28. const類型的C++模板泛化
- 29. Java泛型,從C++模板來
- 30. 識別模板中的基元類型