|
|
@@ -706,3 +706,78 @@ ArrayInClass<int, 10> temp;
|
|
|
|
|
|
### 参数化声明
|
|
|
|
|
|
+C++支持两种基本类型的模板:类模板和函数模板
|
|
|
+
|
|
|
+```cpp
|
|
|
+template<typename T>
|
|
|
+class MyList { // 命名空间内的类模板
|
|
|
+public:
|
|
|
+ template<typename T2> // 成员函数模板
|
|
|
+ MyList(MyList<T2> const&); // 构造函数
|
|
|
+ // ...
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+template<typename T>
|
|
|
+template<typename T2>
|
|
|
+MyList<T>::MyList(MyList<T2> const&) // 位于类外部的成员
|
|
|
+{ // 函数模板的定义
|
|
|
+}
|
|
|
+
|
|
|
+template<typename T>
|
|
|
+int Length(MyList<T> const&); // 位于外部命名空间作用域的函数模板
|
|
|
+
|
|
|
+class Collection {
|
|
|
+ template<typename T> // 位于类内部的成员类模板
|
|
|
+ class Node {
|
|
|
+ // ...
|
|
|
+ };
|
|
|
+
|
|
|
+ template<typename T> // 另一个作为成员的类模板
|
|
|
+ class Handle;
|
|
|
+
|
|
|
+ template<typename T> // 位于类内部的成员函数模板的定义
|
|
|
+ T* allco() { // 显式内联函数
|
|
|
+ // ...
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+template<typename T> // 类外部定义的成员类模板
|
|
|
+class Collection::Handle {
|
|
|
+ // ...
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+除了上面的,联合模板也是允许的(通常被当作类模板)
|
|
|
+
|
|
|
+```cpp
|
|
|
+template<typename T>
|
|
|
+union AllocChank{
|
|
|
+ T object;
|
|
|
+ unsigned char bytes[sizeof(T)];
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+和普通函数一样,函数模板声明也可以具有缺省调用实参
|
|
|
+
|
|
|
+```cpp
|
|
|
+template<typename T>
|
|
|
+void report_top(Stack<T> const&, int number = 10);
|
|
|
+
|
|
|
+template<typename T>
|
|
|
+void fill(Array<T>*, T cosnt & = T())
|
|
|
+```
|
|
|
+
|
|
|
+不过使用`T()`去初始化缺省调用实参也可能存在问题
|
|
|
+
|
|
|
+```cpp
|
|
|
+class Value{
|
|
|
+ public:
|
|
|
+ Value(int);
|
|
|
+}
|
|
|
+void init(Array<Value> *arr){
|
|
|
+ Value zero(0);
|
|
|
+ fill(arr, zero); // 正确的
|
|
|
+ fill(arr); // 错误的 因为不存在Value()的无参构造函数
|
|
|
+}
|
|
|
+```
|