1. 程式人生 > 實用技巧 >《C++ Templates》 函式模板與類模板初探

《C++ Templates》 函式模板與類模板初探

本章主要針對於函式模板做一個初步的總結,補全了一些C++ Prime上缺失的問題;

函式實參型別轉換問題:

在指定模板型別之後,例項化如果型別出現不符合,會進行報錯,所以特定場合需要進行型別轉換:

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

template <typename T> inline const T& rmax(const T& a, const T& b) {
	if (a > b)
		return a;
	else
		return b;
}

template <typename T, typename U> inline const T& rmax(const T& a, const U& b) {
	cout << a << endl << b << endl;
	if (a > b)
		return a;
	else
		return b;
}

int main() {
	cout << rmax(1, 2) << endl;
	//通過直接顯式指定ramx得type為int,直接進行顯示轉換;
	cout << rmax<int>(1, 2.2) << endl;
	//使用static_cast來進行轉換
	cout << rmax(static_cast<double>(4), 2.2)<<endl;
	//使用多個模板引數來進行定義;
	cout << rmax(22.22, 4) << endl;
	system("pause");
	return 0;
}

上述給出了三種最常見的轉換方法:

1.使用static_cast進行強制型別轉換;

2.使用顯示指定type得型別進行轉換;

3.使用多引數模板進行轉換;

類模板特化問題:

C++ prime上並沒有很清晰的講解特化問題,這本書做了一個比較基礎的介紹;

特化的意義:旨在指定一些引數,使得用處比較廣泛的模板變成一些特定引數匹配的模板,有助於某一功能得更好實現;

但是注意:模板的特化只能針對於類模板,而不能針對於函式模板;

特化主要分為三類:

1.全特化;

2.區域性特化(網上又稱為偏特化);

3.不特化(即最原始的模板寫法);

不特化:

即最簡單的模板形式,各種模板型別匹配由實際例項化時讓程式設計師給出;

區域性特化:

對於多個模板引數,現實化的指定出一些引數型別,可以很好的用於模板匹配的情況;

template <typename T> class myclass<T, T> {
	//型別一
};

template <typename T> class myclass<T, int> {
	//型別二
};

template <typename T,typename U> class myclass <T*,U*>{
	//型別三
};

上述可以清楚得看到三種類型的定義形式;

所以可以很直白的看到,區域性特化本質上就是擴充模板函式,相當於為了過載來進行更好的服務;

並且值得注意的是,在實際使用模板引數的時候,給出的個數往往是類名後面得引數個數,編譯器會根據最合適的模板進行例項化;

全特化:

對於全特化,這是區域性特化的升級模式,相當於直接指定類模板引數;

template <> class myclass<string, int> {

};

可以很清晰的看到,實際上就是第一個引數列表直接為空,在類名後面的引數列表中給予指定;

預設模板實參問題:

可以通過預設模板實參方法來在不給定模板引數的情況下進行構造,也可以指定引數,來提高靈活性;

template <typename T, typename CONT = std::vector<T>> class stack {
private:
	CONT elems;
};

可以參照書上得分stack定義來看;

如果使用該定義形式可以將stack類內部管理的資料結構進行指定,也可以不指定,不指定直接視為針對於T的vector例項化;