一个函数对象,即一个重载了括号操作符“()”的对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。
(一)函数对象
在来回顾一下什么是函数对象,就是一个重载'()’运算符的类的对象。这样就可以直接使用‘对象名()’的方式,这跟调用函数一样,所以称谓函数对象。看个例子:
\#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;
}
img
网页标题:浅谈C++函数对象
URL标题:http://www.csdahua.cn/qtweb/news21/474021.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网