良许Linux教程网 干货合集 浅谈C++函数对象

浅谈C++函数对象

一个函数对象,即一个重载了括号操作符“()”的对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。

image-20220222080016236

(一)函数对象

在来回顾一下什么是函数对象,就是一个重载'()’运算符的类的对象。这样就可以直接使用‘对象名()’的方式,这跟调用函数一样,所以称谓函数对象。看个例子:

\#include 
\#include 

class Printer{
public:
 explicit Printer(){};
 void operator()(const std::string & str)const{
   std::coutprint;
 print("hello world!");
 return 0;
}
img

现在来说说函数对象有哪些好处:

(1)函数对象有自己的状态,即它可以携带自己的成员函数,而且这个函数对象在多次调用的过程中它的那些状态是共享的,而函数则不能做到这点(除非定义函数内部的静态变量或者全局变量)。

(2)函数对象有自己的类型,而普通函数则没有。在使用STL的容器时可以将函数对象的类型传递给容器作为参数来实例化相应的模板,从而来定制自己的算法,如排序算法。

假设我需要一个数字产生器,我给定一个初始的数字,然后每次调用它都会给出下一个数字。

\#include 
\#include 
\#include 
\#include 

class SuccessiveNumGen
{
public:
 SuccessiveNumGen(int origin = 0):m_origin(origin){}
 int operator()(){
   return m_origin++;
 }
private:
 int m_origin;
};

int main(int argc,char * argv[]){
 std::vector dest;
 generate_n(back_inserter(dest),10,SuccessiveNumGen(3));
 for(int i=0;ireturn 0;
}

注:此处用到了STL的算法,generate_n会调用SuccessiveNumGen函数十次,back_inserter会将SuccessiveNumGen函数的返回值插入到dest中。

img

(二)Boost.Thread中函数对象的使用

\#include 
\#include 
\#include 

void wait(int sec){
 boost::this_thread::sleep(boost::posix_time::seconds(sec));
}

boost::mutex mutex;

class SayHello{
public:
 explicit SayHello(const std::string & name,int times)
   :_name(name),_times(times){}
 void operator()()const{
   for(int i=0;i<_times class="hljs-built_in" style="color: #0086b3;line-height: 26px">wait(1);
     boost::lock_guard<:mutex> lock(mutex);
     std::cout" says hello ("")""Lux",5);
 SayHello jax("Jax",5);
 
 boost::thread thr1(lux);
 boost::thread thr2(jax);
 
 thr1.join();
 thr2.join();
 return 0;
}
img
img

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

img
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部