C++ 11 bind function

今天开始逐一学习c++11的新用法,从std::function 与 std::bind函数开始。

std::function 是一个template, 在一对<>中指定类型。 std::function 表明定义的是一个有两个int类型的参数,并且返回一个int类返回值的函数对象,这个返回的可调用对象可以理解为函数指针。

具体用法 std::function<返回值<>参数列表>

std::function 可以理解成为函数指针,

作用:

1.保存一般函数

void printA(int a)
{cout << a << endl;          
}std::function func;
func = printA;
func(2);   //2

2.保存lambda表达式

std::function func_1 = [](){cout << "hello world" << endl;};    
func_1();  //hello world

3.保存成员函数

class Foo{Foo(int num) : num_(num){}void print_add(int i) const {cout << num_ + i << endl;}int num_;  
};//保存成员函数
std::function f = &Foo::print_add;
Foo foo(2);
f(foo,1);

.在实际使用中,可使用auto关键字。


关于bind的用法:

可将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

调用bind的一般形式:auto newCallable = bind(callable,arg_list);

其中,newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的参数。即,当我们调用newCallable时,newCallable会调用callable,并传给它arg_list中的参数。

arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是“占位符”,表示newCallable的参数,它们占据了传递给newCallable的参数的“位置”。数值n表示生成的可调用对象中参数的位置:_1为newCallable的第一个参数,_2为第二个参数,以此类推。 from 《C++ primer》

#include 
using namespace std;
class A
{
public:void fun_3(int k,int m){cout<auto f1 = std::bind(fun,1,2,3); //表示绑定函数 fun 的第一,二,三个参数值为: 1 2 3f1(); //print:1  2  3auto f2 = std::bind(fun, placeholders::_1,placeholders::_2,3);//表示绑定函数 fun 的第三个参数为 3,而fun 的第一,二个参数分别由调用 f2 的第一,二个参数指定f2(1,2);//print:1  2  3auto f3 = std::bind(fun,placeholders::_2,placeholders::_1,3);//表示绑定函数 fun 的第三个参数为 3,而fun 的第一,二个参数分别由调用 f3 的第二,一个参数指定//注意: f2  和  f3 的区别。f3(1,2);//print:2  1  3int n = 2;int m = 3;auto f4 = std::bind(fun_2, n,placeholders::_1); //表示绑定fun_2的第一个参数为n, fun_2的第二个参数由调用f4的第一个参数(_1)指定。f4(m); //print:3  4cout<auto f5 = std::bind(&A::fun_3, a,placeholders::_1,placeholders::_2); //使用auto关键字f5(10,20);//调用a.fun_3(10,20),print:10 20std::function fc = std::bind(&A::fun_3, a,std::placeholders::_1,std::placeholders::_2);fc(10,20);//调用a.fun_3(10,20) print:10 20 return 0; 
}

 

 

 

 

 

 

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部