对c++中模板函数函数类型或者函数对象了类型显式指定的理解
2015-03-28 13:48
369 查看
c++中的模板函数可以是定义的函数具有更大的适用性,对于许多具有相同操作但是仅仅是数据类型不同的算法无需重写代码,可以提高代码的复用程度
对于一般的数据类型比如int,double的显式声明只需在<>中进行简单的声明即可。下面考虑函数类型和函数对象类型
一、函数类型
本身函数也是一个指针,根据函数的原型的不同可以将函数分为不同的种类,这里可以将与一个函数对应的函数原型声明为一种指针类型。
例如下面所示
二、函数对象具有和函数相同的调用方式,但是本身他是一个对象对于他的显式的制定需要制定函数的类型
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;
}
对于一般的数据类型比如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;
}
相关文章推荐
- C++11 理解 (二十八) 之 用于计算函数对象返回类型的统一方法
- 深入理解C++对象模型之类型转换:ReinterpretCast
- C++ Pirmer : 第十四章 : 重载运算符与类型转换之函数调用运算符与标准库的定义的函数对象
- C++深入理解(4)------函数模板以及显式具体化(读书笔记)
- C++问题,对象包含与成员函数不兼容的类型限定符
- 深入理解C++对象模型-成员函数的本质以及虚函数的实现(非虚继承)
- C++ 理解函数对象与lambda表达式
- C++问题,对象包含与成员函数不兼容的类型限定符
- C++ Pirmer : 第十五章 : 面向对象程序设计之基类和派生的定义、类型转换与继承与虚函数
- C++ 学习笔记(14)重载运算与类型转换、函数对象、function库
- 解决 ”不允许在查询中显式构造实体类型“问题及使用其他方法实现返回 List<Model对象>或者IQueryable<Model对象>对象
- C++对于运算符*或者+等的重载,函数返回对象需要加const吗?
- 理解 《混沌 In C++::是类型?还是函数调用?》
- 面试题:为什么其他语言里叫函数调用,objective-c里则是给对象发消息(或者谈下对runtime的理解)
- [转]浅析C++中虚函数的调用及对象的内部布局(利用汇编深刻理解C++虚函数底层实现机制)
- [转]浅析C++中虚函数的调用及对象的内部布局(利用汇编深刻理解C++虚函数底层实现机制)
- 用面向对象思维理解.NET委托:函数是对象、委托是函数对象的类型
- 关于C++中在函数中按值返回、临时对象、拷贝构造函数的一点理解
- [c++][语言语法]函数模板和模板函数 及参数类型的运行时判断
- c++ 父类成员函数的参数中有子类类型的对象 (前置声明解决)