天天看點

58 C++ - 模闆機制剖析

1.編譯過程

hello.cpp程式是進階c語言程式,這種程式易于被人讀懂。為了在系統上運作hello.c程式,每一條c語句都必須轉化為低級的機器指令。然後将這些機器指令打包成可執行目标檔案格式,并以二進制形式存儲于磁盤中。

預處理(Pre-processing) -> 編譯(Compiling) ->彙編(Assembling) -> 連結(Linking)

58 C++ - 模闆機制剖析

2. 模闆實作機制

函數模闆機制結論:

  • 編譯器并不是把函數模闆處理成能夠處理任何類型的函數
  • 函數模闆通過具體類型産生不同的函數
  • 編譯器會對函數模闆進行兩次編譯,在聲明的地方對模闆代碼本身進行編譯,在調用的地方對參數替換後的代碼進行編譯。

3. 模闆的局限性

假設有如下模闆函數:

template<class T>
void f(T a, T b)
{ … }
           
class Person
{
public:
	Person(string name, int age)
	{
		this->mName = name;
		this->mAge = age;
	}
	string mName;
	int mAge;
};

//普通交換函數
template <class T>
void mySwap(T &a,T &b)
{
	T temp = a;
	a = b; 
	b = temp;
}
//第三代具體化,顯示具體化的原型和定意思以template<>開頭,并通過名稱來指出類型
//具體化優先于正常模闆
template<>void  mySwap<Person>(Person &p1, Person &p2)
{
	string nameTemp;
	int ageTemp;

	nameTemp = p1.mName;
	p1.mName = p2.mName;
	p2.mName = nameTemp;

	ageTemp = p1.mAge;
	p1.mAge = p2.mAge;
	p2.mAge = ageTemp;

}

void test()
{
	Person P1("Tom", 10);
	Person P2("Jerry", 20);

	cout << "P1 Name = " << P1.mName << " P1 Age = " << P1.mAge << endl;
	cout << "P2 Name = " << P2.mName << " P2 Age = " << P2.mAge << endl;
	mySwap(P1, P2);
	cout << "P1 Name = " << P1.mName << " P1 Age = " << P1.mAge << endl;
	cout << "P2 Name = " << P2.mName << " P2 Age = " << P2.mAge << endl;
}