模板總結

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 }

 

Tags: