天天看點

C++ 模闆詳解(函數模闆、類模闆)

C++模闆詳解

模闆概念

模闆定義:模闆就是實作代碼重用機制的一種工具,它可以實作類型參數化,即把類型定義為參數, 進而實作了真正的代碼可重用性。

模版可以分為兩類,一個是函數模版,另外一個是類模版。

函數模闆針對僅參數類型不同的函數

類模闆針對僅資料成員和成員函數類型不同的類。

說明: template是一個聲明模闆的關鍵字,表示聲明一個模闆關鍵字class不能省略,如果類型形參多餘一個 ,每個形參前都要加class <類型 形參表>可以包含基本資料類型可以包含類類型

注意:模闆的聲明或定義隻能在全局,命名空間或類範圍内進行。即不能在局部範圍,函數内進行,比如不能在main函數中聲明或定義一個模闆

函數模闆

格式:Template <class/typename 形參名, class/typename 形參名>

傳回類型 函數名(形參表){//函數定義體 }

函數模闆示例:

#include <iostream>
using namespace std;
template <typename T>
T Add(T left, T right)
{
       return left + right;
}
int main()
{
       Add(1, 2);
       Add(1.0, 2.0);
       Add('1', '1');
       Add(1, 1.0);//error:模闆參數“T”不明确
       //模闆函數不會進行類型轉換
       Add<int>(1, '1');//顯式執行個體化
       Add<double>(1, 1.0);
       Add(1, (int) 1.0);//隐式執行個體化
       return 0;
}
           

類模闆

一個類模闆(也稱為類屬類或類生成類)同意使用者為類定義一種模式。使得類中的某些資料成員、默寫成員函數的參數、某些成員函數的傳回值,能夠取随意類型(包含系統提前定義的和使用者自己定義的)

假設一個類中資料成員的資料類型不能确定。或者是某個成員函數的參數或傳回值的類型不能确定。就必須将此類聲明為模闆,它的存在不是代表一個詳細的、實際的類,而是代表着一類類。

類模闆的使用實際上是将類模闆執行個體化成一個詳細的類。它的格式為:類名<實際的類型>。 模闆類是類模闆執行個體化後的一個産物

類模闆與模闆類的差別:

類模闆是模闆的定義,不是一個實實在在的類,定義中用到通用類型參數。

模闆類是實實在在的類定義,是類模闆的執行個體化。類定義中參數被實際類型所代替

格式:Template < class/typename T >

class 類名{

//類定義......

};

在類模闆外部定義成員函數的方法為:template<模闆形參清單> 函數傳回類型 類名<模闆形參名>::函數名(參數清單){函數體}

類模闆示例:

#include <iostream>
using namespace std;
template<typename T1, typename T2>
class myClass
{
private:
       T1 I;
       T2 J;
public:
       myClass(T1 a, T2 b);
       void show();
};
template<typename T1, typename T2>
myClass<T1, T2>::myClass(T1 a, T2 b) :I(a), J(b)
{
}
template<typename T1, typename T2>
void myClass<T1, T2>::show()
{
       std::cout << "I=" << I << ", J=" << J << std::endl;
}
int main(void)
{
       myClass<int, int>c1(3, 5);
       c1.show();
       myClass<int, char> class2(1, 'a');
       class2.show();
       myClass<double, int> class3(2.9, 10);
       class3.show();
       return 0;
}
           

模闆形參

有二種類型的模闆形參:類型形參,非類型形參

1、類型形參由關鍵字class或typename後接說明符構成

2、 模闆的非類型形參也就是内置類型形參, 隻能是整型,指針和引用

3、調用非類型模闆形參的實參必須是一個常量表達式

預設模闆類型形參:

1、可以為類模闆的類型形參提供預設值,但不能為函數模闆的類型形參提供預設值。函數模闆和類模闆都可以為模闆的非類型形參提供預設值

2. 類模闆的類型形參預設值形式為:template<class T1, class T2=int> class A{};為第二個模闆類型形參T2提供int型的預設值。

非類型模闆參數舉例:

#include <iostream>
using namespace std;
template<typename T, int MAXSIZE>
class Stack {
Private:
       T elems[MAXSIZE];
       …
};
int main()
{
       Stack<int, 20> int20Stack;
       Stack<int, 40> int40Stack;
};
           

繼續閱讀