美文网首页
C++ 11 新特性(六)

C++ 11 新特性(六)

作者: IT孤独者 | 来源:发表于2018-09-11 21:32 被阅读0次

最近在学C++ 11 , 发现很多有意思的东西,感觉C++在变好,但是。。。

书接上文,在C语言中,如果想一个函数返回一个新的函数其实是不行的,也就是说C语言是不具备函数式编程的能力的,C++ 可以,有两种实现方式,一种是使用Lambda 表达式,另一种是使用标准库的bind 函数,bind 的实现原理得益于 C++11 实现了不定长参数的模板定义。

Lambda 表达式的一种写法:

#include <iostream>

template<typename T>
auto addN(T n) {
   return [n](decltype(n) m) {
      return n + m;
   };
}

int main() {
   auto f = addN(5);
   std::cout<< f(10) << std::endl;
   return 0;
}

std::bind 的实现如下:

#include <iostream>
#include <functional>

//template<typename T>
//auto add(T n, T m) {
//   return n + m;
//}

auto add(int n, int m) {
   std::cout << "n = " << n << std::endl;
   std::cout << "m = " << m << std::endl;
   return n + m;
}

int main() {
   auto f = std::bind(add, 5, std::placeholders::_1);
   std::cout<< f(10) << std::endl;
   std::cout<< f(200) << std::endl;
   return 0;
}

代码中我特意写了一段模板形式的 add 函数,如果你去编译,其实是过不去的,简单的说,对于模板函数由于没有实体,所以 bind 函数无法操作,解决的方案就是使用函数对象替代它,代码如下:

#include <iostream>
#include <functional>

template<typename T>
class add {
   public:
      auto operator()(T n, T m) {
         std::cout << "n = " << n << std::endl;
         std::cout << "m = " << m << std::endl;
         return n + m;
      }
};

int main() {
   auto f = std::bind(add<int>(), 5, std::placeholders::_1);
   std::cout<< f(10) << std::endl;
   std::cout<< f(200) << std::endl;
   return 0;
}

在说一点, std::placeholders::_1 就是一个参数占位符,怎么实现的我不太了解,后期有时间再弄,但是这里的作用就是告诉函数f ,输入的第一个参数传递给原来的函数的第二个位置!!!

这里还是有些问题,明天再说!

相关文章

  • C++ 11 新特性(六)

    最近在学C++ 11 , 发现很多有意思的东西,感觉C++在变好,但是。。。 书接上文,在C语言中,如果想一个函数...

  • C++ 11 语言特性介绍

    C++ 11 语言特性 新特性说明nullptr,autoNAfor-each区间迭代shared_ptr uni...

  • C++ 11常用特性

    C++ 11常用特性(转)

  • C++ 11 新特性

    C++11 中值得关注的几大变化(详解) | | 酷 壳 - CoolShell 1. delete 和 defa...

  • cppinsights 编译安装

    cppinsights 是一款C++源代码到源代码的转换,它可以把C++中的模板、auto以及C++11新特性展开...

  • C++ 11 新特性汇总

    内容引自《写给大忙人看的C++》,未包含多线程相关话题,但是基本上C++最重要的方面都包括在内了 概要 改进的对象...

  • C++ 11新特性(部分)

    1. 右值引用 对左值的引用(lValue),放在赋值表达式左边的,有精确的内存地址; 右值(rValue) 指的...

  • C++ 11 新特性(四)

    Lambda 表达式在一定程度上是可以和函数对象进行互转的。例子如下: 从代码中可以推测,Lambda 的捕获代码...

  • C++ 11 新特性(一)

    看下面代码,回答问题: 变量x的数据类型是什么? 其实我也不知道,这要是在C99中是不会这么使用的,但是代码的确可...

  • C++ 11 新特性(二)

    Lambda 表达式。在C99中因为没有这个东西,导致STL库中的if算法都不太方便使用,但是有了Lambda表达...

网友评论

      本文标题:C++ 11 新特性(六)

      本文链接:https://www.haomeiwen.com/subject/fujpgftx.html