模板總結
1、普通函數和函數模板區別
普通函數傳入的形參類型是固定的,模板是任意類型
2、普通函數和函數模板調用規則
普通函數和函數模板都可以調用時,優先調用普通函數
空模板參數列表可以強制調用函數模板myprint<>(a, b);
函數模板也可以發生函數重載
如果函數模板可以產生更好的匹配,優先調用函數模板
3、函數模板並不是萬能的
有些特定的數據結構需要具體的實現
比如:
1 class person 2 { 3 public: 4 person(string name, int age) 5 { 6 this->age = age; 7 this->name = name; 8 } 9 string name; 10 int age; 11 }; 12 //具體化的person實現比較 13 template<> bool mycompare(person &a, person &b) 14 { 15 if (a.age == b.age && a.name == b.name) 16 return true; 17 else 18 return false; 19 } 20 void test02() 21 { 22 person p1("tom", 10); 23 person p2("pel", 20); 24 bool ret = mycompare(p1, p2); 25 if (ret) 26 cout << "p1=p2" << endl; 27 else 28 cout << "p1!=p2" << endl; 29 }
4、函數模板和類模板區別
類模板:在類的前邊加上 templete <class t>
類模板沒有自動類型推導,person<string> p1(“zhang”, 18); //必須指定類型
類模板在模板參數列表template <class NameType, class AgeType=int>,可以指定數據類型
5、類模板對象做函數參數
指定參數類型:void print1(person<string, int>&p)
參數模板化:
template <class t1, class t2>
void print2(person<t1, t2>&p)
整個類模板化:
template <class t1>
void print3(t1&p)
6、子類繼承父類
class son :public base<int> //必須知道父類類型
或者(子類模板):
template <class t1,class t2>
class son2 :public base<t2>
7、類模板成員函數類外實現
1 template <class t1, class t2> 2 class person 3 { 4 public: 5 person(t1 name, t2 age); 6 void show(); 7 8 t1 name; 9 t2 age; 10 11 }; 12 13 template <class t1, class t2> 14 person<t1,t2>::person(t1 name, t2 age) 15 { 16 this->age = age; 17 this->name = name; 18 }