刘聪 пре 3 година
родитељ
комит
914cc7b764
1 измењених фајлова са 75 додато и 0 уклоњено
  1. 75 0
      cpp/泛型与模板.md

+ 75 - 0
cpp/泛型与模板.md

@@ -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()的无参构造函数
+}
+```