C++ lamda、function、bind使用

参考资料:

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

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

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

clipboard

      使用示例:

clipboard[1]

clipboard[2]

  • function

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

clipboard[3]

  • bind

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

clipboard[4]

注:

    对于不事先绑定的参数,需要传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("xxx@gmail.com");
    }

注:

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

posted @ 2014-11-07 22:15  罗松超  阅读(765)  评论(0编辑  收藏  举报