函数对象

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>);

}

函数对象比函数指针的优点:

  1.      通过函数对象调用operatro() ,可以省略函数的调用开销,比通过函数指针不能inline 效率更高
  2.  因为函数对象是用类生成的,因此可以添加相关的其他成员变量,可以做其他的记录

上面的函数对象是二元函数对象

 

posted @ 2020-09-01 19:55  睡觉lc  阅读(181)  评论(0编辑  收藏  举报