对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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值