類模板能夠被特化ios
類模板特化能夠分爲部分特化和徹底特化兩種類型編程
編程實驗:類模板特化ide
// 44-1.cpp #include<iostream> using namespace std; template<typename T1, typename T2> class Test { public: void add(T1 a, T2 b) { cout << "void add(T1 a, T2 b)" << endl; cout << a + b << endl; } }; template<typename T1, typename T2> class Test<T1*, T2*> // 關於指針的特化實現 { public: void add(T1* a, T2* b) { cout << "void add(T1* a, T2* b)" << endl; cout << *a + *b << endl; } }; template<typename T> class Test<T, T> // 當 Test 類模板的兩個類型參數徹底相同時,使用這個實現 { public: void add(T a, T b) { cout << "void add(T a, T b)" << endl; cout << a + b << endl; } void print() { cout << "class Test<T, T>" << endl; } }; template<> class Test<void*, void*> // 當 T1 == void* 而且 T2 == void* 時 { public: void add(void* a, void* b) { cout << "void add(void* a, void* b)" << endl; cout << "Error to add void* param..." << endl; } }; int main() { Test<int, float>t1; // 必須顯示指明每個類型參數 Test<long, long>t2; Test<void*, void*>t3; t1.add(1, 2.5); t2.add(5, 5); t2.print(); t3.add(NULL, NULL); Test<int*, double*>t4; int a = 1; double b = 0.1; t4.add(&a, &b); return 0; }
$ g++ 44-1.cpp -o 44-1 $ ./44-1 void add(T1 a, T2 b) 3.5 void add(T a, T b) 10 class Test<T, T> void add(void* a, void* b) Error to add void* param... void add(T1* a, T2* b) 1.1
注意事項:函數
函數模板只支持類型參數徹底特化
編程實驗:函數模板特化spa
// 44-2.cpp #include<iostream> using namespace std; template<typename T> bool Equal(T a, T b) { cout << "bool Equal(T a, T b)" << endl; return a == b; } template<> bool Equal<double>(double a, double b) { const double delta = 0.00000000000001; double r = a - b; cout << "bool Equal<double>(double a, double b)" << endl; return (-delta < r) && (r < delta); } bool Equal(double a, double b) { const double delta = 0.00000000000001; double r = a - b; cout << "bool Equal(double a, double b)" << endl; return (-delta < r) && (r < delta); } int main() { cout << Equal(1, 1) << endl; cout << Equal<>(0.01, 0.01) << endl; // 指定使用模板 cout << Equal(0.1, 0.1) << endl; return 0; }
編譯運行指針
$ g++ 44-2.cpp -o 44-2 $ ./44-2 bool Equal(T a, T b) 1 bool Equal<double>(double a, double b) 1 bool Equal(double a, double b) 1
建議:就當須要重載函數模板時,優先考慮使用模板特化,當模板特化沒法知足要求時,再使用函數模板。code
一、類模板能夠定義任意多個不一樣的類型參數
二、類模板能夠部分特化和徹底特化,特化本質上是模板的分開實現
三、函數模板只支持徹底特化blog