C++ lamda、function、bind使用

参考资料:

http://blog.csdn.net/augusdi/article/details/11771699

  • lambda 表达式的简单语法如下:[capture] (parameters) -> return value { body }

其中[capture]可以选择如下的不同形式:

使用示例:

  • function

std::function对象是对C++中现有的可调用实体的一种类型安全的包裹,std::function 使用

  • bind

std::bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用。 C++0x中,提供了std::bind,它绑定的参数的个数不受限制,绑定的具体哪些参数也不受限制.

注:

对于不事先绑定的参数,需要传std::placeholders进去,从_1开始,依次递增。placeholder是pass-by-reference的占位符。

  • 综合示例:
    1、EmailProcessor.h

    #pragma once
    
    #include <functional>
    #include <string>
    using namespace std;
    
    class EmailProcessor
    {
        private:
        function<void (const string&)> _handle_func;
    
        public:
        void receiveMessage(const string& str)
        {
            if(_handle_func)
            {
            _handle_func(str);
            }
        }
    
        void setHandlerFunc(function<void (const string&)> func)
        {
            _handle_func=func;
        }
    };

    2、MessageStored.h

    #pragma once
    #include <string>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    class MessageStored
    {
        private:
        vector<string> _store;
    
        bool find(const string& str,const string& key)
        {
            return [&](){
                size_t pos=str.find(key);
                return pos!=string::npos && str.substr(pos)==key;
            }();
        }
    
        public:
        bool checkMessage(const string& str)
        {
            for(auto iter=_store.begin(),end=_store.end();
                iter!=end;iter++)
            {
            if(find(str,*iter))
            {
                cout<<"Sending Msg "<<str<<endl;
                return true;
            }
            }
            cout<<"no match email"<<endl;
            return false;
        }
    
        void addMsgStore(const string str)
        {
            _store.push_back(str);
        }
    };

    3、main.cpp

    #include "EmailProcessor.h"
    #include "MessageStored.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
        MessageStored stored;
        string mails[]={"@163.com","@qq.com","@gmail.com"};
        for(string str:mails)
        {
        stored.addMsgStore(str);
        }
    
        EmailProcessor processor;
        auto func=std::bind(&MessageStored::checkMessage,stored,placeholders::_1);
        processor.setHandlerFunc(func);
        processor.receiveMessage("[email protected]");
    }

注:

&MessageStored::checkMessage是获取类成员函数的地址

时间: 2024-08-07 04:33:11

C++ lamda、function、bind使用的相关文章

【转帖】漫话C++0x(四) —- function, bind和lambda

实在是觉得此文总是去翻感觉不太好.于是果断转过来了,想看原文的请戳:http://www.wuzesheng.com/?p=2032 本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制.之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解.在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础.下面我们来看看wikipedia上对于计算机领域的closu

function/bind 函数适配器

1.function/bind简介 function是一种类模板,重载了operator()函数调用操作符,所以每一个function类的对象都是一个函数对象. bind是一种函数适配器,可以改变参数的个数.顺序. 2.相关代码 1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <functional> 5 using namespace std; 6 7 voi

Extjs使用Ext.function.bind, 给句柄函数传参

回调函数updateImage中的key参数,在外部调用时有程序员自己指定. 使用Ext.Function.bind(this.updateImage, this, 'imageUrl', true) 参数一:updateImage函数引用, 参数二:this(固定写法) 参数三:程序员自定义updateImage函数引用中的key参数值 参数四:true (固定写法) showSelectImageWindow: function() { var me = this.getView(); th

C++ function/bind

function/bind 1. std::function i.  是一个函数的包装器 ii. std::function<R(T1, T2, ..., TN)> iii. 这是一个模板实现的函数对象类,它可以包装其它任意的函数对象,而被包装的函数对象具有类型为T1,T2,…,TN的参数,其返回值为R类型 iv. function 对象的最大用处在于实现函数回调 2. bind i.   bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体(可

javascript 中 function bind()

Function bind() and currying <%-- All JavaScript functions have a method called bind that binds to an object and returns a new function. The first argument to bind sets the this context of the function. function area (height) { return this.width * he

function bind()

function t(){alert(this.a);} t() var t2 = t.bind({a:2}) t2() t.call({a:2}) bind()的实现原理.用处   待整理 function bind()

function/bind的救赎(上)

这是那篇C++0X的正文.太长,先写上半部分发了. Function/bind可以是一个很简单的话题,因为它其实不过就是一个泛型的函数指针.但是如果那么来谈,就没意思了,也犯不上写这篇东西.在我看来,这个事情要讲的话,就应该讲透,讲到回调(callback).代理(delegate).信号(signal)和消息传递(messaging)的层面,因为它确实是太重要了.这个话题不但与面向对象的核心思想密切相关,而且是面向对象两大流派之间交锋的中心.围绕这个问题的思考和争论,几乎把20年来所有主流的编

C++ TR1 Function Bind

在C++ 11出现以前,C++的事件一般是通过回调形试来实现,如 void (*func)(int,int,int),其实际上是一种函数指针,在C中调用时是直接写函数名在参数列表中,而在C++中,大部份的回调需要定义成 static.也就是静态函数.通过::作用域符,方式调用. 当然在C++TR11出现前,更早的function 与Bind 在开源库中boost 中就有,而C++11 tr1也就是借鉴了或者直接使用了boost库中的相关模板. 现在就来说说C++ tr1 中的Function 模

为什么React事件处理函数必须使用Function.bind()绑定this?

最近在React官网学习Handling Events这一章时,有一处不是很明白.代码如下: class Toggle extends React.Component { constructor(props) { super(props); this.state = {isToggleOn: true}; // This binding is necessary to make `this` work in the callback this.handleClick = this.handleC

ES6下的Function.bind方法

在JavaScript的使用中,this的指向问题始终是一个难点.不同的调用方式,会使this指向不同的对象.而使用call,apply,bind等方式,可改变this的指向,完成一些令人惊叹的黑魔法 最近了解了一下Function对象下的bind方法,同时对JavaScript对象下this指向,call,apply等方法有了更深刻的了解 function.apply(thisArg,[argsArray]) thisArg: function函数运行时的this值 argsArray: 一个