C++11学习笔记之三lamda表达式,std::function, std::bind

//lamda
//first lamda
[]
{};

// second lamda
[]() //or no need () when paramater is null
{
std::cout << "second" << std::endl;
}();// last add(), express will call this lamda func

// 3 with return type
auto kkk = []()
{
return 1;
}();

// 4, set return type
auto kkkk = [] (int i) -> bool { return (bool)i; }(5);

//5, lamda capture, [=], [=,&], [&], [this][] 不捕获...
/*[&] 以引用的方式捕获
[=] 通过变量的一个拷贝捕获
[=, &foo] 通过变量的拷贝捕获,但是用foo变量的引用捕获
[bar] 通过复制捕获,不要复制其他
[this] 捕获this指针对应成员
*/

function, bind等,上代码

#include <iostream>
#include <functional>
using namespace std;
typedef std::function<void()> fp;
typedef std::function<void(int)> fpi1;
void g_fun()
{
    std::cout << "global function bind" << std::endl;
}

class A
{
public:
    static void aFunStatic()
    {
        std::cout << "aFunStatic" << std::endl;
    }

    virtual void aFun()
    {
        std::cout << "aFun" << std::endl;
    }

    void aFunI1(int i)
    {
        std::cout << "aFunI1:"  << i << std::endl;
    }

};

class DerivedA
    :public A
{
public:
    virtual void aFun() override
    {
        std::cout << "aFun in DeriveA" << std::endl;
    }
};

class B
{
public:
    void bCallAFun()
    {
        if(callFun)
            callFun();
    }
    void bCallAFunStatic()
    {
        if(callFunStatic)
            callFunStatic();
    }

    void bCallAFunI1(int i)
    {
        if(callFunI1)
            callFunI1(i);
    }

    fp callFunStatic;
    fp callFun;
    fpi1 callFunI1;
};

void main()
{
    B b;
    A a;

    //bind to global function
    fp f = fp(&g_fun);
    f();

    //bind to class function
    //static
    b.callFunStatic = std::bind(&A::aFunStatic);
    b.bCallAFunStatic();

    //no static function without parameter
    b.callFun = std::bind(&A::aFun, &a);
    b.bCallAFun();

    //no static function with parameter
    b.callFunI1 = std::bind(&A::aFunI1, &a, std::placeholders::_1);
    b.bCallAFunI1(5);

    //about polymorphic
    DerivedA da;
    b.callFun = std::bind(&A::aFun, &da);
    b.bCallAFun();
}
时间: 2024-12-26 20:29:55

C++11学习笔记之三lamda表达式,std::function, std::bind的相关文章

c++ 11学习笔记--Lambda 表达式(对比测试Lambda ,bind,Function Object)

所有c++ coder都应该为这个语法感到高兴,说的直白一点,Lambda 表达式就是函数对象的语法糖. 还是直接看对比栗子吧,抄袭的是msdn的官网 该示例使用 for_each 函数调用中嵌入的 lambda 向控制台打印 vector 对象中的每个元素是偶数还是奇数. 使用lambda #include <algorithm> #include <iostream> #include <vector> using namespace std; int main()

c++ 11学习笔记-- 常量表达式(constexpr)

最新在弄android ndk相关的,惊奇的发现最新的ndk10的版本已经gcc4.9了,我印象中,gcc4.8就支持C++0x11,14的支持,gcc再次走到了llvm的前面,LLVM最新的版本3.4.2应该只支持c++ 11,如果是同样的c++代码我一直认为llvm的效率会明显强过gcc. 废话不多说,让我们开始学习c++ 11吧,说实话我之前一直都很抗拒c++新的语法,感觉太难接受了,现在看来不熟悉也不行了. 常量表达式(constexpr) 常量表达式机制是为了: 提供了更多的通用的值不

MySQL学习笔记之三 表类型

你能用的数据库引擎取决于MySQL在安装时候是如何被编译的.要添加一个新的引擎,就必须编译MySQL.仅仅为了添加一个特性而编译应用程序的想法对于Windows的开发人员来说可能有点小题大做,得不偿失,但是在Unix的世界里,这已经成为了标准.在缺省的情况下,MySQL支持三个引擎:ISAM.MyISAM和HEAP.另外两种类型InnoDB和Berkley(BDB),也常常可以使用. ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之初就考虑到数据库被查询的次数远远大于

c++ 11学习笔记--智能指针

C++ 98的 std::auto_ptr已经被彻底遗弃了,取而代之的是unique_ptr.shared_ptr与weak_ptr.大部分时候我们自己手动申请内存方式内存都是没有问题的,问题是如果程序很大了之后,一个复杂的对象,多次拷贝的代价非常高,很多地方都会使用到,只存在一份拷贝显然是最好的,这个时候对象生命周期的管理就会很复杂,所以c++引入了智能指针. 任何事物都会有两面性. Shared_ptr 摘录于Effective C++, 3rd Edition, Item 17: 在 st

代码简洁之道:C++ 11 之auto+ for_each + lamda表达式

摘要:在很多中情况下,我们需要这样的运算:给vector中每个元素进行相似的处理(每个元素+1,或者其他).一般情况下,我们会选用for循环,然后然后对每个元素进行处理.实际上,C++ 11提供了了lamda表达式,结合for_each,可以写出更加简洁和高效的代码. 1.for_each.简介 for_each是C++中的模板,具体用法可以参考这里:http://www.cplusplus.com/reference/algorithm/for_each/ 2.lamda表达式 lamda表达

Struts2学习笔记(OGNL表达式)

Struts2学习笔记(OGNL表达式) Struts 2支持以下几种表达式语言: OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言: JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言: Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python.Ruby和Smarttalk等)的一些起特性: Velocity,严格来说不是表达式语言,它是一种基于Ja

Citrix XenMobile学习笔记之三:MAM移动应用管理(Mobility Application Management)

产品简介 思杰(Citrix)在其全面的企业移动解决方案中提供了企业级移动应用管理(MAM)功能.XenMobile MAM 版由CloudGateway发展而来.CloudGateway是思杰进入MAM的跳板.该产品的所有功能在XenMobile的MAM版中都有,现在叫做App版,思杰还有带有完整功能的企业版.XenMobile的移动应用管理组件运行在iOS.安卓.Windows.Windows Phone.Mac OS X.黑莓甚至塞班上.XenMobile支持iOS与安卓上的原生应用.MA

Derby-10.11学习笔记汇总

鲁春利的工作笔记,谁说程序员不能有文艺范? Derby-10.11学习笔记(一)简单介绍 http://luchunli.blog.51cto.com/2368057/1716255 Derby-10.11学习笔记(二)脚本介绍 http://luchunli.blog.51cto.com/2368057/1716464 Derby-10.11学习笔记(三)

mongodb 学习笔记 03 -- 查询表达式

mongodb 学习笔记 03 – 查询表达式 不等于,大于,小于 !=: db.stu.find({name:{$ne:'billvsme'}}) 名字不是'billvsme' > : db.stu.find({age:{$gt:18}}) 年纪大于18 < : db.stu.find({age:{$lt:18}}) 年纪小于18 >=: $gte <=: $lte in/not in/all $in :db.goods.find(stu_id:{$in:[93001,93002