C++ lamda、function、bind使用
参考资料:
- 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("xxx@gmail.com"); }
注:
&MessageStored::checkMessage是获取类成员函数的地址