当前位置: 首页 > news >正文

网站开发技术方案模板网站都能做响应式

网站开发技术方案模板,网站都能做响应式,网站 续费,wordpress做个人教学网站本文是C0x系列的第四篇#xff0c;主要是内容是C0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲#xff0c;是因为这三块之间有着非常密切的关系#xff0c;通过对比学习#xff0c;加深对这部分内容的理解。在开始之间#xff0c;首先要讲一… 本文是C0x系列的第四篇主要是内容是C0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲是因为这三块之间有着非常密切的关系通过对比学习加深对这部分内容的理解。在开始之间首先要讲一个概念closure闭包这个概念是理解lambda的基础。下面我们来看看wikipedia上对于计算机领域的closure的定义A closure (also lexical closure, function closure or function value) is a function together witha referencing environment for the non-local variables of that function. 上面的大义是说closure是一个函数和它所引用的非本地变量的上下文环境的集合。从定义我们可以得知closure可以访问在它定义范围之外的变量也即上面提到的non-local vriables这就大大增加了它的功力。关于closure的最重要的应用就是回调函数这也是为什么这里把function, bind和lambda放在一起讲的主要原因它们三者在使用回调函数的过程中各显神通。下面就为大家一步步接开这三者的神秘面纱。1. function 我们知道在C中可调用实体主要包括函数函数指针函数引用可以隐式转换为函数指定的对象或者实现了opetator()的对象即C98中的functor)。C0x中新增加了一个std::function对象std::function对象是对C中现有的可调用实体的一种类型安全的包裹我们知道像函数指针这类可调用实体是类型不安全的。我们来看几个关于function对象的例子#include functional std::function size_t (const char*) print_func; /// normal function - std::function objectsize_t CPrint(const char*) { ... }print_func CPrint;print_func(hello world): /// functor - std::function objectclass CxxPrint{public:    size_t operator()(const char*) { ... }};CxxPrint p;print_func p;print_func(hello world);    在上面的例子中我们把一个普通的函数和一个functor赋值给了一个std::function对象然后我们通过该对象来调用。其它的C中的可调用实体都可以像上面一样来使用。通过std::function的包裹我们可以像传递普通的对象一样来传递可调用实体这样就很好解决了类型安全的问题。了解了std::function的基本用法下面我们来看一些使用过程中的注意事项1关于可调用实体转换为std::function对象需要遵守以下两条原则a. 转换后的std::function对象的参数能转换为可调用实体的参数b. 可高用实体的返回值能转换为std::function对象的这里注意所有的可调用实体的返回值都与返回void的std::function对象的返回值兼容。2std::function对象可以refer to满足1中条件的任意可调用实体3std::function object最大的用处就是在实现函数回调使用者需要注意它不能被用来检查相等或者不相等2. bind bind是这样一种机制它可以预先把指定可调用实体的某些参数绑定到已有的变量产生一个新的可调用实体这种机制在回调函数的使用过程中也颇为有用。C98中有两个函数bind1st和bind2nd它们分别可以用来绑定functor的第一个和第二个参数它们都是只可以绑定一个参数。各种限制使得bind1st和bind2nd的可用性大大降低。C0x中提供了std::bind它绑定的参数的个数不受限制绑定的具体哪些参数也不受限制由用户指定这个bind才是真正意义上的绑定有了它bind1st和bind2nd就没啥用武之地了因此C0x中不推荐使用bind1st和bind2nd了都是deprecated了。下面我们通过例子来看看bind的用法#include functional int Func(int x, int y);auto bf1 std::bind(Func, 10, std::placeholders::_1);bf1(20); /// same as Func(10, 20) class A{public:    int Func(int x, int y);}; A a;auto bf2 std::bind(A::Func, a, std::placeholders::_1, std::placeholders::_2);bf2(10, 20); /// same as a.Func(10, 20) std::function int(int) bf3 std::bind(A::Func, a, std::placeholders::_1, 100);bf3(10); /// same as a.Func(10, 100)    上面的例子中bf1是把一个两个参数普通函数的第一个参数绑定为10生成了一个新的一个参数的可调用实体体; bf2是把一个类成员函数绑定了类对象生成了一个像普通函数一样的新的可调用实体; bf3是把类成员函数绑定了类对象和第二个参数生成了一个新的std::function对象。看懂了上面的例子下面我们来说说使用bind需要注意的一些事项1bind预先绑定的参数需要传具体的变量或值进去对于预先绑定的参数是pass-by-value的2对于不事先绑定的参数需要传std::placeholders进去从_1开始依次递增。placeholder是pass-by-reference的3bind的返回值是可调用实体可以直接赋给std::function对象4对于绑定的指针、引用类型的参数使用者需要保证在可调用实体调用之前这些参数是可用的5类的this可以通过对象或者指针来绑定3. lambda 讲完了function和bind, 下面我们来看lambda。有python基础的朋友相信对于lambda不会陌生。看到这里的朋友请再回忆一下前面讲的closure的概念lambda就是用来实现closure的东东。它的最大用途也是在回调函数它和前面讲的function和bind有着千丝万缕的关系。下面我们先通过例子来看看lambda的庐山真面目vector int vec;/// 1. simple lambdaauto it std::find_if(vec.begin(), vec.end(), [](int i) { return i 50; });class A{public:    bool operator(int i) const { return i 50; }};auto it std::find_if(vec.begin(), vec.end(), A()); /// 2. lambda return syntaxstd::function int(int) square [](int i) - int { return i * i; } /// 3. lambda expr: capture of local variable{    int min_val 10;    int max_val 1000;     auto it std::find_if(vec.begin(), vec.end(), [](int i) {        return i min_val i max_val;         });     auto it std::find_if(vec.begin(), vec.end(), [](int i) {        return i min_val i max_val;        });     auto it std::find_if(vec.begin(), vec.end(), [, max_value](int i) {        return i min_val i max_val;        });} /// 4. lambda expr: capture of class memberclass A{public:    void DoSomething(); private:    std::vectorint  m_vec;    int               m_min_val;    int               m_max_va;}; /// 4.1 capture member by thisvoid A::DoSomething(){    auto it std::find_if(m_vec.begin(), m_vec.end(), [this](int i){        return i m_min_val i m_max_val; });} /// 4.2 capture member by default pass-by-valuevoid A::DoSomething(){    auto it std::find_if(m_vec.begin(), m_vec.end(), [](int i){        return i m_min_val i m_max_val; });} /// 4.3 capture member by default pass-by-referencevoid A::DoSomething(){    auto it std::find_if(m_vec.begin(), m_vec.end(), [](int i){        return i m_min_val i m_max_val; });} 上面的例子基本覆盖到了lambda表达的基本用法。我们一个个来分析每个例子标号与上面代码注释中1234一致1这是最简单的lambda表达式可以认为用了lambda表达式的find_if和下面使用了functor的find_if是等价的2这个是有返回值的lambda表达式返回值的语法如上面所示通过-写在参数列表的括号后面。返回值在下面的情况下是可以省略的a. 返回值是void的时候b. lambda表达式的body中有return expr且expr的类型与返回值的一样3这个是lambda表达式capture本地局部变量的例子这里三个小例子分别是capture时不同的语法第一个小例子中表示capture的变量pass-by-value, 第二个小拿出中表示capture的变量pass-by-reference第三个小例子是说指定了default的pass-by-value, 但是max_value这个单独pass-by-reference4这个是lambda表达式capture类成员变量的例子这里也有三个小例子。第一个小例子是通过this指针来capture成员变量第二、三个是通过缺省的方式只不过第二个是通过pass-by-value的方式第三个是通过pass-by-reference的分析完了上面的例子我们来总结一下关于lambda表达式使用时的一些注意事项1lambda表达式要使用引用变量需要遵守下面的原则a. 在调用上下文中的局部变量只有capture了才可以引用如上面的例子3所示b. 非本地局部变量可以直接引用2使用者需要注意closurelambda表达式生成的可调用实体引用的变量主要是指针和引用在closure调用完成之前必须保证可用这一点和上面bind绑定参数之后生成的可调用实体是一致的3关于lambda的用处就是用来生成closure而closure也是一种可调用实体所以可以通过std::function对象来保存生成的closure也可以直接用auto 通过上面的介绍我们基本了解了function, bind和lambda的用法把三者结合起来C将会变得非常强大有点函数式编程的味道了。最后这里再补充一点对于用bind来生成function和用lambda表达式来生成function, 通常情况下两种都是ok的但是在参数多的时候,bind要传入很多的std::placeholders而且看着没有lambda表达式直观所以通常建议优先考虑使用lambda表达式。http://blog.csdn.net/hongjunbj/article/details/8891387            再分享一下我老师大神的人工智能教程吧。零基础通俗易懂风趣幽默还带黄段子希望你也加入到我们人工智能的队伍中来https://blog.csdn.net/jiangjunshow
http://www.pierceye.com/news/877057/

相关文章:

  • 如何建单位网站怎么让别人找你做网站
  • 青海建设厅职称网站建设小程序怎么挂失
  • 建设在线购物网站51zwd一起做网站广州
  • 如何制作网站图片帮忙做网站
  • 高端做网站公司网络信息安全公司
  • 手机网站图片自适应建设网站用的软件
  • wordpress postid随机苏州百度推广排名优化
  • 重庆企业网站推广服务做性的网站
  • asp.net 创建网站登陆建设银行网站异常
  • 柳州网站建设柳州wordpress 创建文集
  • 怎样把网站做成app多语言网站建设方案
  • 中国最新新闻头条南通百度网站快速优化
  • 乐清网站推广制作长沙银狐做网站
  • 做企业网站需要多久论坛网站推广方案
  • 郑州网站优化排名wordpress搭建本地博客
  • 如何获取网站域名证书刚刚北京传来重大消息
  • 找别人做淘客网站他能改pid吗现在中型公司做网站用的是什么框架
  • 泉州晋江网站建设费用海南建设银行官网招聘网站
  • 自己给公司做网站郑州工程建设信息网站
  • 单页网站建站外贸公司网站怎么设计更好
  • 滨州建设工程备案网站网站制作九江
  • 北京网站制作业务如何开展全屋整装定制
  • 网站seo博客刷百度关键词排名
  • 制作企业网站的代码馆陶专业做网站
  • 网站建设简介联系方式PHP 网站开发 重点知识
  • 网页设计网站排行榜浅谈一下网络营销的几个误区
  • 上海网站制作公司报价中国十大咨询公司
  • 软件开发和网站建设哪个好dede网站本地访问速度慢
  • 平安建设网站做写手哪个网站好
  • 服务器硬件影响网站速度网站链接优化