【发布时间】:2015-10-19 10:49:34
【问题描述】:
到目前为止,在我读过的所有书籍中,他们都说 C++ 模板会为我们使用的每种类型生成一个代码实例。
另一方面,书上说在 C# 中代码是可重用的。
所以我在很多书籍中进行了搜索,我在一本非常古老的书中找到了以下 C# 示例。
1) 值类型
List<int> intList1 = new List<int>();
List<int> intList2 = new List<int>();
List<bool> boolList = new List<bool>();
在这种情况下(值类型),编译器为 intList1 和 intList2(相同类型)生成一个代码实例,为 boolList 生成一个代码实例。
2) 引用类型
List<Dog> dogList1 = new List<Dog>();
List<Dog> dogList2 = new List<Dog>();
List<Cat> catList = new List<Cat>();
在这种情况下(引用类型),编译器只为 dogList1、dogList1 和 catList 生成一个代码实例,因为只要它可以表示指向对象的指针,所有引用类型都可以共享一个实现。
这对我来说很清楚(作为 C++ 开发人员),但我对有关 c++ 模板的同样事情感到好奇。
早在 C# 创建之前,C++ 也有值类型和引用类型。
让我们用 C++ 重写前面的例子
1) 值类型
vector<int> intList1;
vector<int> intList2;
vector<bool> boolList;
在这种情况下,我毫不怀疑 intList1 和 intList2 共享相同的代码,而 boolList 需要另一个实现
2) 引用类型
vector<Dog *> dogList1;
vector<Dog *> dogList2;
vector<Cat *> catList;
我的问题是:
我能否得出结论,在第二种情况下(指针向量),只要所有向量指针(vector
【问题讨论】:
-
它是特定于实现的。请注意,C++11 有
extern template -
“C++ 也有值类型和引用类型”——“值”和“引用”类型之间没有区别。您可以拥有指向
int的指针,并且可以使用Dog作为值。 -
对我来说,这个问题应该被称为“二进制”重用。
-
这不是很多实现定义的吗? AFAIK 语言标准对二进制表示的假设很少......
-
指针不是引用类型。 C++ 没有(也从未有过,也永远不会有)C# 中已知的“引用类型”。此外,C++ 模板与 C# 泛型有很大不同。