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. 识别模板中的基元类型