std::bind
2016-06-07 17:56
246 查看
1. std::placeholders
占位符。
std::placeholders::_1 , std::placeholders::_2 ,std::placeholders::_N
作为参数用在std::bind表达式中,会被存在函数对象中,当含有未绑定参数的函数对象被调用时,std::placeholders::_1被替换成函数对象的第一个参数,std::placeholders::_n被替换成函数对象的第n个参数。
2. std::bind
f 可调用对象(函数对象,函数指针,函数引用,成员函数指针,成员数据指针)
args 要绑定的参数,为绑定的可以用占位符替代
返回一个未定义类型函数对象
原理可以访问如下网址:
http://www.cnblogs.com/xusd-null/p/3698969.html
输出:
3. std::function
普遍的多态函数包装器。
注:
通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。
输出
占位符。
std::placeholders::_1 , std::placeholders::_2 ,std::placeholders::_N
作为参数用在std::bind表达式中,会被存在函数对象中,当含有未绑定参数的函数对象被调用时,std::placeholders::_1被替换成函数对象的第一个参数,std::placeholders::_n被替换成函数对象的第n个参数。
2. std::bind
template< class F, class... Args > /*unspecified*/ bind( F&& f, Args&&... args ); // (1) (since C++11) template< class R, class F, class... Args > /*unspecified*/ bind( F&& f, Args&&... args ); // (2) (since C++11)
f 可调用对象(函数对象,函数指针,函数引用,成员函数指针,成员数据指针)
args 要绑定的参数,为绑定的可以用占位符替代
返回一个未定义类型函数对象
原理可以访问如下网址:
http://www.cnblogs.com/xusd-null/p/3698969.html
#include <random> #include <iostream> #include <memory> #include <functional> void f(int n1, int n2, int n3, const int& n4, int n5) { std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 << ' ' << n5 << '\n'; } int g(int n1) { return n1; } struct Foo { void print_sum(int n1, int n2) { std::cout << n1+n2 << '\n'; } int data = 10; }; int main() { using namespace std::placeholders; // for _1, _2, _3... // demonstrates argument reordering and pass-by-reference int n = 7; // (_1 and _2 are from std::placeholders, and represent future // arguments that will be passed to f1) auto f1 = std::bind(f, _2, _1, 42, std::cref(n), n); n = 10; f1(1, 2, 1001); // 1 is bound by _2, 2 is bound by _1, 1001 is unused // nested bind subexpressions share the placeholders auto f2 = std::bind(f, _3, std::bind(g, _3), _3, 4, 5); f2(10, 11, 12); // common use case: binding a RNG with a distribution std::default_random_engine e; std::uniform_int_distribution<> d(0, 10); std::function<int()> rnd = std::bind(d, e); // a copy of e is stored in rnd for(int n=0; n<10; ++n) std::cout << rnd() << ' '; std::cout << '\n'; // bind to a pointer to member function Foo foo; auto f3 = std::bind(&Foo::print_sum, &foo, 95, _1); f3(5); // bind to a pointer to data member auto f4 = std::bind(&Foo::data, _1); std::cout << f4(foo) << '\n'; // smart pointers can be used to call members of the referenced objects, too std::cout << f4(std::make_shared<Foo>(foo)) << '\n' << f4(std::make_unique<Foo>(foo)) << '\n'; }
输出:
2 1 42 10 7 12 12 12 4 5 1 5 0 2 0 8 2 2 10 8 100 10 10 10
3. std::function
普遍的多态函数包装器。
注:
通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。
#include <functional> #include <iostream> struct Foo { Foo(int num) : num_(num) {} void print_add(int i) const { std::cout << num_+i << '\n'; } int num_; }; void print_num(int i) { std::cout << i << '\n'; } struct PrintNum { void operator()(int i) const { std::cout << i << '\n'; } }; int main() { // store a free function std::function<void(int)> f_display = print_num; f_display(-9); // store a lambda std::function<void()> f_display_42 = []() { print_num(42); }; f_display_42(); // store the result of a call to std::bind std::function<void()> f_display_31337 = std::bind(print_num, 31337); f_display_31337(); // store a call to a member function std::function<void(const Foo&, int)> f_add_display = &Foo::print_add; const Foo foo(314159); f_add_display(foo, 1); // store a call to a data member accessor std::function<int(Foo const&)> f_num = &Foo::num_; std::cout << "num_: " << f_num(foo) << '\n'; // store a call to a member function and object using std::placeholders::_1; std::function<void(int)> f_add_display2= std::bind( &Foo::print_add, foo, _1 ); f_add_display2(2); // store a call to a member function and object ptr std::function<void(int)> f_add_display3= std::bind( &Foo::print_add, &foo, _1 ); f_add_display3(3); // store a call to a function object std::function<void(int)> f_display_obj = PrintNum(); f_display_obj(18); }
输出
-9 42 31337 314160 num_: 314159 314161 314162 18
相关文章推荐
- nginx FastCGI错误Primary script unknown解决办法
- iOS 动态改变约束
- java swing-基本的框架结构
- 北航面试之计算机从按下电源键到出现桌面是怎样的过程(linux)
- android背景选择器selector用法汇总
- ORACLE口令文件验证与操作系统验证
- 走对路!在智能时代别捡了芝麻丢了西瓜!
- centos6.5安装cmake-gui
- Linux程序设计——线程
- LDA主题词模型
- Jquery-1实现简单的复选框删除增加操作
- SAP SMP SDK 3.0 SP9支持Android OS 什么版本
- ios推送证书、发布证书和app IDs的一些关系
- 一步一步教你写股票走势图——分时图五(自定义标记)
- 构建之法阅读笔记02
- 第二阶段第5天(6月4日)
- mybatis 中的稍微复杂些的sql语句
- 第一个NDK工程--hello ndk
- 嵌入式Linux裸机开发(七)——UART串口通信
- C# 特性