范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

C从函数指针函数对象到Lambda表达式让代码更有弹性更通用

  函数对象,由类实现,类有属性,实例化为对象后表现为对象的状态。类可以重载函数运算符"()",对象对此运算符的调用看起来就如果函数的调用一样,不同的是,这是一个对象,所以有其状态,这是其与普通函数的独到之处,有其独特的适用场景。
  看下面的实例:#include  #include  #include  using namespace std;  bool larger_than_80(double x)  {      return x>80;  }  void func(list& v) {     list::iterator p = find_if(v.begin(), v.end(), larger_than_80);     if (p!=v.end()) {          cout<<*p< lst (arr, arr + sizeof(arr) / sizeof(*arr) );     func(lst);     getchar();     return 0; }
  如果谓词函数想更改为bool larger_than_60(double x)  {      return x>60;  }
  显然这不是一种便捷的方法,把代码写死(硬编码,hard coded)是不好的,于是,函数指针和函数对象就可以登场了:#include  #include  #include  using namespace std;  bool larger_than_80(double x)  {      return x>80;  }  void func(list& v) {     list::iterator p = find_if(v.begin(), v.end(), larger_than_80);     if (p!=v.end()) {          cout<<*p<& v) {     class CLarger_than {         int v;     public:         CLarger_than(int vv) : v(vv) { }                // store the argument         bool operator()(int x) const { return x>v; }    // compare     };     CLarger_than Larger_than(70);     list::iterator p = find_if(v.begin(), v.end(), Larger_than);     if (p!=v.end()) {          cout<<*p< lst (arr, arr + sizeof(arr) / sizeof(*arr) );     func(lst);     func2(lst);      getchar();     return 0; }
  显然,函数对象有更大的灵活性。
  通常重载函数调用运算符的函数体都只有几行代码,可以inline,由此,相对于函数指针来说,效率更高。与此同时,函数对象可以嵌在函数内定义,而使用函数指针引用的函数无法嵌套,所以使用函数对象可以让代码更加紧凑。
  函数对象带有状态。函数对象相对于普通函数是"智能函数",这就如同智能指针相较于传统指针。因为函数对象除了提供函数调用符方法,还可以拥有其他方法和数据成员。所以函数对象有状态。即使同一个类实例化的不同的函数对象其状态也不相同,这是普通函数所无法做到的。而且函数对象是可以在运行时创建。
  每个函数对象有自己的类型:对于普通函数来说,只要签名一致,其类型就是相同的。但是这并不适用于函数对象,因为函数对象的类型是其类的类型。这样,函数对象有自己的类型,这意味着函数对象可以用于模板参数,这对泛型编程有很大提升。
  函数对象一般快于普通函数,因为其可以inline实现。函数对象一般用于模板参数,模板一般会在编译时会做一些优化。
  但函数对象这种代码的写法似乎有点冗余,于是Lambda表达式便登场了。
  Lambda表达式是从类创建函数的精简方式。这里讲的类,它仅有的成员就是函数调用运算符。Lambda表达式取消了类声明,并且使用了精简的符号来表示函数调用运算符的逻辑。class LessThan { public:     bool operator()(int a, int b)     {         return a& v) {     list::iterator p = find_if(v.begin(), v.end(), [](double a){return a>60;});     if (p!=v.end()) {          cout<<*p<(sum) / static_cast(num);     } private:     int num;     int sum; }; int main() {     vector v{ 1, 3, 5, 7 };     MeanValue mv = std::for_each(v.begin(), v.end(), MeanValue{});     cout << mv.value() << endl; // output: 2.5                          return 0; }
  使用引用捕捉的lambda表达式: int main() {     int x = 10;     auto add_x = [x](int a) { return a + x; };         // 复制捕捉x     auto multiply_x = [&x](int a) { return a * x; }; // 引用捕捉x     cout << add_x(10) << " " << multiply_x(10) << endl;     // 输出:20 100     return 0; }
  主要的语法形式:
  []:默认不捕获任何变量;
  [=]:默认以值捕获所有变量;
  [&]:默认以引用捕获所有变量;
  [x]:仅以值捕获x,其它变量不捕获;
  [&x]:仅以引用捕获x,其它变量不捕获;
  [=, &x]:默认以值捕获所有变量,但是x是例外,通过引用捕获;
  [&, x]:默认以引用捕获所有变量,但是x是例外,通过值捕获;
  [this]:通过引用捕获当前对象(其实是复制指针);
  [*this]:通过传值方式捕获当前对象;
  其参数还可以自动推断:auto add = [](auto x, auto y) { return x + y; }; int x = add(2, 3); // 5 double y = add(2.5, 3.5); // 6.0
  ref:
  https://www.cnblogs.com/AlainGao/p/10675201.html
  -End-

几百行代码完成百度搜索引擎Hello大家好,我是鸭血粉丝,大家都叫我阿粉,搜索引擎想必大家一定不会默认,我们项目中经常使用的ElasticSearch就是一种搜索引擎,在我们的日志系统中必不可少,ELK作为特斯拉电动皮卡Cybertruck原型新视频配巨大雨刷,无门把手IT之家2月7日消息,一段关于特斯拉电动皮卡Cybertruck的新视频刚刚在CybertruckOwnersClub俱乐部论坛上流出,这段视频很可能拍摄自得克萨斯州的Gigafa巨一科技董秘回复公司将积极开拓包括小米华为等在内的客户巨一科技(688162)02月07日在投资者关系平台上答复了投资者关心的问题。投资者董秘,您好,小米汽车正式落户北京亦庄目标两期累计年产30万辆车,除了造车新势力与传统汽车大企的合ZCBVR电线和ZRBVR电线有什么区别?ZCBVR电线和ZRBVR电线有什么区别?现在日常生活工业生产都离不开电,电线向血管一样遍布各个用电领域。电线电缆的品种繁多,用途极为广泛。常用的电线有B系列橡皮塑料电线及R系列橡接棒Redmi?魅族将开售百元新机中国芯5000mAh电池,顶配899元随着国民收入不断提高,去年人均GDP已经达到了80976元,人均可支配收入3。51万元。兜里有money,买东西也就更加大方。走在大街上,放眼望去好像全都是用苹果和华为旗舰手机的,乐高做成的小清闲乐高创意项目宝丽来相机,真机大小喔宝丽来,多少文艺小清新的心头好。即时成像的卖点在胶卷时代曾独领风骚。情书后会无期春娇与志明逃离德黑兰还有墨镜王的重庆森林和春光乍泄等等很多电影里都能找到他的身影。最早Instagr美股面临货币收缩与技术红利消耗殆尽双重冲击,A股该如何布局?美股面临货币收缩与技术红利消耗殆尽双重冲击,A股又该如何布局?文丁彦皓可信财商珂芯资产一过去十几年,美股持续上涨主要是基于移动互联网的技术红利与货币宽松政策最近十几年,全球兴起了一AI给教师写教学成绩单,人工智能教育是大势所趋?近日,杭州电子科技大学部分教师都收到了一份年度教学成绩单,同时还配有一封来自AI(人工智能技术)的信。据了解,这个教师教学成绩单AI写信开发小组是由研究生本科生开发的,其中基础数据微软Zune闰年bug分析最近在网上看到一篇帖子,得知了当年微软zune的历史留名的bug,具体事件的起因发展和结果我就不多说了。找到了出现bug的源码,分享出来。while(days365)if(IsLe这些科技界的大腕儿,原来都属虎科技日报记者马爱平在中国人的心里虎,代表着勇敢和无畏在科技界何泽慧于敏顾方舟樊锦诗这些属虎的老一辈科学家们身上无不体现着勇攀高峰敢于创新的科学家精神虎年到今天让我们走近这些属虎的科中科院3位女神集智慧和美貌于一身,这才是我们学习的榜样华罗庚谈科学时曾说过,做科学,就是老老实实地做学问,不可能只靠运气来发明。如果对事情的本质都不理解,那遇上机会也没用。中国科技进步迅速且强大,是因为有许许多多的工作者,在举步维艰的
OPPO宣布与印度航天机构合作,非议马上来了印度国家航天机构印度空间研究组织(ISRO)与中国手机品牌Oppo印度公司的合作在当地引发非议。据印度斯坦时报等多家媒体报道,印度反对党国大党和许多网民在社交媒体上质疑,当ISRO去年年薪百万今年行业失散,高途坠落背后的情怀烧钱和人性战场这里的故事都不算新鲜。中国互联网几十年发展过程中,风口变幻,高途用很短的时间演示了一家发现蓝海,投身而入的公司又如何被迅速抛下。在它的故事里,可以看到大佬的创业情怀,和瑞幸相似的被汇科学暖流建创新高地大湾区科学论坛在广州开幕汇科学暖流建创新高地冬日湾区,温暖如春。以探索未来,共享科学为主题的大湾区科学论坛,12月11日在广东广州开幕。大湾区科学论坛由一带一路国际科学组织联盟发起当996成为一种奢望,互联网大厂的梦碎时刻皮之不存,毛将焉附。当互联网行业内的企业在中概股遭遇重挫,与之对应的是,那些在互联网公司上班的员工们,也随公司一起,走进了这个空前寒冷的冬天。当宏观经济的不景气终于传导到了个人身上手把手教你一句话让小爱帮你控制智能家居!全网最细教程小伙伴们大家好!之前两期我们学习了智能家居的更换与连接,今天我们来学习如何设置智能家居的联动,让你学会如何一句话让小爱同学帮你打开各种智能设备,还有各种场景的设置,例如回家自动开灯入手OPPOReno7Pro几天,聊聊我对它的使用感受作为OPPO旗下面向时尚年轻群体的Reno系列,每款机型的出现都吸引了无数年轻时尚消费者们的关注与追捧。而笔者也同样是其中的一个,在这次OPPOReno7Pro首销当天,我就直接花华为watch3和watchgt3差别?要想了解华为watch3和watchgt3差别,那么我们先看看他们两个是啥配置,话不多说,直接上图。华为watchgt3华为watchgt3华为watch3华为watch3通过两张OPPO手机怎么选,什么款性价比高,拍摄怎样,一文解答前段时间,刚梳理完蓝厂vivo与其子品牌iQOO,这一次来到绿厂阵营OPPO系。vivo手机怎么选,哪款性价比高,哪款值得买,一篇文章来梳理OPPO系包括主品牌OPPO,子品牌re德媒评选2021最佳手机TOP10六款国产手机上榜,一加表现抢眼严谨的德国媒体Connect在近日评选出了2021年度最佳手机TOP10,评选了今年市面上正在销售的手机,且仅包含安卓手机,因此你会在这份榜单中看到去年的老旗舰,因为在今年它们依然路由器要多久关闭一次?多亏宽带师傅告诫,难怪网速变龟速了畅谈关于装修的那些事,分享装修的各种经验和知识。大家好,我是畅谈装修,关注我即可了解更多关于装修的那些事!路由器现在已经是居家生活中不可缺少的伙伴,没有了它,相信连饭吃得都不香了。网曝三星GalaxyS22系列将于年初发布,超大杯改名了年底了,手机行业也都在为来年的新机做宣传了,隔三差五频频爆出某某品牌某某新机的相关信息,最近,有网友爆料,三星明年的旗舰新机GalaxyS22系列将要来了,而其中的超大杯不再采用G