泛型編程之函數模板

 》模板的引入,爲什麼要使用模板?

   在程序設計中往往存在這樣一種現象:兩個或多個函數的函數體完全相同,差別僅在於他們的參數類型不同,就需要分別給不同的數據類型定義不同的版本。

   解決以上問題的一個比較好的方法就是使用模板。模板是實現代碼重用機制的一種工具,他可以實現類型參數化,即把類型定義爲參數,從而實現代碼複用。

 》模板的分類:

   模板分爲函數模板和類模板。他們分別允許用戶構造模板函數和模板類。

 》函數模板:

   建立一個通用函數,其函數返回類型和形參類型不確定,用一個虛擬的類型來代表,這個通用函數就稱爲函數模板。

  函數模板聲明格式:

   template <typename 類型參數>

   返回類型 函數名(模板形參表)

   {函數體

   }

其中template是一個表明聲明一個模板的關鍵字;

  typename也可以用class作用一樣表示其後是一個虛擬的類型名;

  類型參數實際上是一個類型名;

例:

template <typename T>
T max(T x, T y)
{
	return (x > y) ? x : y;
}


》如何使用函數模板

  上面max()函數代表一類函數,要使用這個模板函數就需要將T實例化爲確定的數據類型,這個實例化的參數就叫做模板實參。

  函數名(模板實參表)

例:

template <typename T>
T max(T x, T y)
{
return (x > y) ? x : y;
}
int main()
{
int i1 = 19,i2=23;
double d1 = 50.344, d2 = 4656.346;
char c1 = 'k', c2 = 'n';
cout << "The max of i1,i2 is= " << max(i1, i2) << endl;
cout << "The max of d1,d2 is= " << max(d1, d2) << endl;
cout << "The max of c1,c2 is= " << max(c1, c2) << endl;
return 0;
}

結果:

       wKioL1cWEYDjQNfHAAA1s4xQ_08858.png


從上例看出,函數模板提供了一類函數的抽象,它以類型參數T爲參數及函數返回值的虛擬類型。函數模板經實例化而生成的具體函數稱爲模板函數


》一個和指針相關的函數模板

template <typename AT>
AT sum(AT* array, int size = 0)
{
AT total = 0;
for (int i = 0; i < size; i++)
{
total += array[i];
}
return total;
};
int int_array[] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 1010 };
double double_array[] = { 11.1,22.2,33.3, 44.4, 55.5, 66.6, 77.7, 88.8, 99.9, 100.10 };
int main()
{
int itotal = sum(int_array, 10);
double dtotal = sum(double_array, 10);
cout << "這個整型數組的元素之和是:" << itotal << endl;
cout << "這個雙精度型數組的元素之和是:" << dtotal << endl;
return 0;
}

結果:

wKiom1cWFMjiTzuvAAA038AzZYs566.png

  在程序中生成了兩個模板函數,sum(int_array)和sum(double_array)分別將類型參數實例化爲int型和double型。


》同樣的函數模板也允許使用多個類型參數,但是template定義部分的每個類型參數前必須要有關鍵字typename。

template <typename para1,typename para2>
void two_para(para1 x, para2 y)
{
cout << x << ' ' << y << endl;
}
int main()
{
two_para(99, "zhang");
two_para(123.45, 888L);
return 0;
}

結果:

wKiom1cWGK_AfRcBAAAuCPgs-tY543.png

1.在這個程序中,生成了兩個模板函數,“two_para(99,"zhang")”,分別用模板實參int,char*將類型參數para1和para2實例化,“two_para(123.45,888L)”,分別用模板實參double,long將類型參數para1和para2實例化,

2.在template語句與函數模板定義語句之前不允許插入別的語句。

3.同一般函數一樣,函數模板也可以重載。


template <typename Type>
Type min(Type x, Type y)
{
	return (x < y) ? x : y;
}

template <typename Type>
Type min(Type x, Type y, Type z)
{
	Type t;
	t = (x < y) ? x : y;
	return (t < z) ? t: z;
}

int main()
{
	int m = 10, n = 20, min2;
	double a = 10.1, b = 20.2, c = 30.3, min3;
	min2 = min(m, n);
	min3 = min(a, b, c);
	cout << "min(" << m << "," << n << ")=" << min2 << endl;
	cout << "min(" << a << "," << b << "," << c << ")=" << min3 << endl;
	return 0;
}

結果:

   wKioL1cWHTDBDVCjAAAtTV-e4uQ476.png


》函數模板和非函數模板可以重載,調用順序是:首先尋找一個參數完全匹配的非函數模板,如果找到就調用它,如果沒有就尋找函數模板將其實例化,產生一個匹配的模板函數。















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章