一个函数对象,即一个重载了括号操作符“()”的对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。
(一)函数对象
在来回顾一下什么是函数对象,就是一个重载'()’运算符的类的对象。这样就可以直接使用‘对象名()’的方式,这跟调用函数一样,所以称谓函数对象。看个例子:
\#include
\#include
class Printer{
public:
explicit Printer(){};
void operator()(const std::string & str)const{
std::coutprint;
print("hello world!");
return 0;
}
现在来说说函数对象有哪些好处:
(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中。
(二)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;
}
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !