1. 程式人生 > 其它 >C++ 初識template

C++ 初識template

技術標籤:C++

關於C++的template:

  • template並非一次編譯便生出適合所有型別的程式碼,而是針對被使用的(某個或某組)型別進行編譯。
  • 這導致一個重要的問題:實際處理 template時,面對template function,你必須先提供它的某個例項,然後才能呼叫。
    如此方可通過編譯。

一個簡單的例子:

#include<iostream>
#include<vector>
using namespace std;

template <typename T>
const T Maxs(T a, T b){
	return a<
b?b:a; } int main(int argc, char const *argv[]) { /* 當代呼叫Maxs(1,2)函式時候,模板中T才會被指定為int型別,這差不多 就是泛型程式設計了 */ cout<<Maxs(1,2)<<endl; cout<<Maxs(1.1,2.5)<<endl;

在這裡插入圖片描述

Notype Template引數(非類別模板引數)

  • 型別(ype)可作為 template引數,非型別( nontype)也可以作為 templat引數。
  • 非型別引數因而可被看做是整個 template型別的一部分。例如可以把標準類別bitset<>的 bits 數量以
  • template引數指定之。以下述句定義了兩個由bits構成的容器,分別為32個bits空間和50個bits空間
bitset<32> flags32// bitset with 32 bits
bitset<50> flags50/ bitset with 50 bits
注意:32位和50位的bitset不能相互賦值或比較

Default Template Parameters (預設模板引數)

  • 例項:允許使用一個或兩個template引數宣告MyClass物件
template<typename T, typename container = vector<T>>
class MyClass{ /* typename被用來作為型別之前額識別符號號,如: typename T::SubType * ptr; T::SubType * ptr; 的區別: typename指出SubType是 typename T中定義的一個類別,因此ptr是指向T::SubType型別的指標 T::SubType * ptr;則表示型別T的SubType變數和ptr進行相乘 */ // 成員模板 template<typename T> void f(T); /* void f(T);這種宣告方式,使用任何類別引數。這個特性通常用來為template typename中 的成員提供自動型別轉換。(assign函式就是如此) */ T value; template<typename T> void assign(const MyClass<X>& x){ value = x.getValue(); } T getValue()const{ return value; } }; //兩種宣告都有效 MyClass<double> x1; MyClass<int, vector<int>> x2; x1.value = 11; x2.assign(x1); cout<<"x2.value = "<<x2.value<<endl;

Template constructor

/*
	Template constructor是成員模板的一種特殊形式,
	常用於“複製物件時實現隱式型別轉換”
	Template constructor 並不hide implicit COPY constructor,
	如果型別完全吻合,implicit COPY constructor就會被產生出來並被呼叫
*/
template<typename T>
class MyClass2{
public:
	T value;
	template<typename U> //注意巢狀模板,typename的名字不可相同
	MyClass2(const MyClass2<U>& x){
		value = x.value;
	}
};
void f(){
	MyClass2<double> xd;
	xd.value = 10.5;
	MyClass2<double> xd2(xd);//call built-in copy constructor
	MyClass2<int> xi(xd);
	/*
		xd2和xd型別一致,所以被內建的copy ctor初始化。
		xi則不同xd所以,所以它使用template ctor進行初始化
	*/
}