函数对象
c++中函数对象,其实就是C中函数指针,也就是()的运算符重载函数
因此把 有operator() 重载函数的对象称作函数对象
与C语言的 函数指针相比
// C 语言函数指针的做法 // 即使写出inline 函数 但是当作为函数指针时,也无法内联 template<typename T> inline bool mygreater( T a, T b) { return a>b: } template<typename T> inline bool myless ( T a, T b) { return a<b: } template<typename T ,typename Comp> bool compare(T a, T b, Comp comp) { reyurn comp(a,b); // 在这里编译的时候无法确定具体的函数地址,因此函数指针调用时,必定有标准的函数调用开销 } int main() { compare(10,20,mygreater<int>); }
函数指针无法处理inline 函数,因此效率不高
c++ 函数对象
template<typename T> class mygreater { public: bool operator() ( T a , T b) { return a>b; } }; template<typename T> class myless { public: bool operator() ( T a, T b) { return a<b: } } template<typename T ,typename Comp> bool compare(T a, T b, Comp comp) { reyurn comp(a,b); // 此时调用时,传入的是对象,当然知道是那个对象。 } int main() { compare(10,20,mygreater<int>); }
函数对象比函数指针的优点:
- 通过函数对象调用operatro() ,可以省略函数的调用开销,比通过函数指针不能inline 效率更高
- 因为函数对象是用类生成的,因此可以添加相关的其他成员变量,可以做其他的记录
上面的函数对象是二元函数对象