對c++中模板函數函數類型或者函數對象了類型顯式指定的理解

c++中的模板函數可以是定義的函數具有更大的適用性,對於許多具有相同操作但是僅僅是數據類型不同的算法無需重寫代碼,可以提高代碼的複用程度

對於一般的數據類型比如int,double的顯式聲明只需在<>中進行簡單的聲明即可。下面考慮函數類型和函數對象類型

一、函數類型

本身函數也是一個指針,根據函數的原型的不同可以將函數分爲不同的種類,這裏可以將與一個函數對應的函數原型聲明爲一種指針類型。

例如下面所示

bool gt(int a){
	return a>5? true:false;
}
template <typename T,typename Fn>
int countF(T a,T b,Fn fn){
	int count=0;
	while(a!=b){
		if(fn(*a)){
			count++;
		}
		++a;
	}
	return count;
}<pre class="cpp" name="code">int main(){
	typedef bool (*fun)(int);
	int a[]={10,2,1213,12,435,123,1231};
	int num=countF<int[],fun>(a,a+7,gt);
	cout<<num<<endl;
	return 0;
}


二、函數對象具有和函數相同的調用方式,但是本身他是一個對象對於他的顯式的制定需要制定函數的類型

template<typename T>
class GT{
public:
	GT(T a){
		this->num=a;
	}
	bool operator()(T valR){//仿函數
		return valR>this->num? true:false;
	}
private:
	T num;
};

int main(){
	vector<int> myVec(10);
	for(size_t i=0;i<10;i++){
		myVec[i]=i;
	}
	vector<int>::iterator start=myVec.begin();
	vector<int>::iterator tail=myVec.end();
	num=countF(start,tail,GT<int>(5));
	cout<<num<<endl;

	typedef vector<int>::iterator pp;
	num=countF<pp,GT<int> >(start,tail,GT<int>(5));
	cout<<num<<endl;
	return 0;
}


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