首页 > 编程知识 正文

std函数是什么意思(std::bind绑定成员函数)

时间:2023-05-03 09:57:13 阅读:74752 作者:817

文章目录一、std:bind函数1 .简要介绍2、使用二、什么是可调用对象? 伪函数指针lambda表达式3,std:function可以调用对象包装器1 .定义2 .注意事项3.(1)基本用法2 )作为回调函数和参数4,作为回调函数

另一方面,STD:3360bind函数1 .要简要介绍的STD:3360bind函数在头文件functional中定义,它是一个类似函数适配器的函数模板,可以调用对象(callable objectional 生成新的可调用对象并“适应”原始对象的STD:3360bind将可调用对象与参数绑定,然后可以使用std:function保存绑定的结果。 STD33603360bind主要具有以下作用:

将可调用对象及其参数绑定到伪函数;

仅绑定某些参数,减少可调用对象传递的参数。 即,将多变量(参数数n,n1 )可调用对象集中或) n-1 )原可调用对象与function可调用对象包装器一块使用可以绑定类的成员函数。

使用方式:

autonewcallable=bind(fun,arg_list; 调用newCallable时,将调用callable并将其传递给arg_list中的参数。

请注意,arg_list参数可能包含类似于_n名称的占位符。 其中n是整数,这些占位符表示newCallable的参数,并占据传递给newCallable的参数的位置。 n表示参数在生成的可调用对象中的位置。 _1是新调用的第一个参数,_2是第二个参数,等等。

我们之所以使用auto newCallable保存绑定返回值,是因为我们不关心真正的返回值类型。 实际上,std:bind的返回类型是在stl内部定义的伪函数类型。 可以直接分配给std:function,直到他是伪函数。

使用2,)1)绑定的参数以传递值的形式占位,未绑定的参数以std:placeholders )的形式占位,从_1开始依次递增,以引用传递的形式表示也就是说,缺省情况下,不是bind占位符的参数将复制到bind返回的可调用对象中。 如果需要将对象传递给绑定参数,则必须使用ref或cref。

std:placeholders表示新可调用对象的第几个参数,它与原始函数占位符的位置匹配。

)2)如果绑定类成员函数,则第一个参数表示指向对象的成员函数的指针,第二个参数表示对象的地址(如果不是对象的地址,传入的是对象的副本)。 这是因为对象的成员函数需要this指针。 编译器还必须手动转换对象的成员函数,而不是隐式转换为函数指针

)3) std:bind的返回值是可调用实体,可以直接分配给std:function。

二、什么是可调用对象? 执行任务的语句序列可以视为函数、可调用对象。

在编程中,我们习惯于将一系列可复用的语句抽象为函数,将变化的部分抽象为函数的参数。 函数的使用大大减少了代码的重复性。 在c中,有很多方法具有函数这一行为。 例如,如下

func(paran1、param2); 这里的func是函数调用名,param1和param2是函数参数。 在c中,关于func的类型有以下几种。

普通函数系成员函数系静态函数仿形函数(函数对象)函数指针lambda表达式std:function不介绍普通函数、类成员函数和类静态函数的调用。

伪函数使用类来模拟函数的调用行为。 如果重载类的operator ()方法,则可以像调用函数一样调用类。

# includeiostreamusingnamespacestd; classadd { public : int operator () (int a,int b ) ) {return a b; }; int main () {添加添加; intres=add (10,20 ); //函数一样//add.operator (() ) )、20 ); 等效cout res endl; 返回0; }执行结果:

class Obj {public:int value; obj(intval=0) :value(val ) cout ' val : ' value ' thisisconstructer ' endl; }voidoperator(((intval ) ) cout ' val : ' val ' this is operator ) ) ' endl; }; int main () {Obj a; //首先构建对象A(10 );//第一种方法Obj () ) 2

0); //第二种方法Obj a2(1); a2(100); return 0;} #执行结果val:0 this is constructerval:10 this is operator()val:0 this is constructerval:20 this is operator()val:1 this is constructerval:100 this is operator() 函数指针

指向函数的指针。是一个指针。可以将函数名赋值给相同类型的函数指针,可以通过调用函数指针调用函数。
函数指针是标准的C/C++的回调函数的使用解决方案函数类型由它的返回值和参数类型决定,与函数名无关

bool fun(int a,int b)

上述函数类型是:bool(int,int)
上述函数的函数指针pf是:bool (*pf)(int,int)
函数名即为函数指针
定义函数指针的方法:

typedef bool (*fun)(int,int) //定义一个fun类型的函数指针

示例:

int fun(int a, int b){cout << "this is fun" << endl;return a + b;}typedef int(*fp)(int, int); //fp是一个函数指针类型,相当于int *类型int fun1(fp f, int a, int b){cout << "this is fun1" << endl;return f(a, b);}//等价于下面的int fun2(int(*f)(int, int), int a, int b){cout << "this is fun2" << endl;return f(a, b);}int main(){cout << fun1(fun,10, 20) << endl;cout << fun2(fun, 10, 20) << endl;return 0;}

执行结果:

this is fun1this is fun30this is fun2this is fun30 lambda表达式 三、std::function 可调用对象包装器 1.定义

由上文可以看出:由于可调用对象的定义方式比较多,但是函数的调用方式较为类似,因此需要使用一个统一的方式保存可调用对象或者传递可调用对象。于是,std::function就诞生了。

std::function是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。

2.注意点

(1)需要引用functional库
(2)需要注意对于类成员函数,因为类成员函数包含this指针参数,所以单独使用std::function是不够的,还需要结合使用std::bind函数绑定this指针以及参数列表。
(3)std::function可以取代函数指针的作用,因为它可以延迟函数的执行,特别适合作为回调函数使用。它比普通函数指针更加的灵活和便利。
(4)std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象,简化调用;

3.使用 #include<functional>std::function<函数类型>//例如std::function<bool(int,int)> (1)基本用法

代码展示:

//普通函数int add(int a, int b){return a + b;}typedef int(*Fp_Type)(int, int);class Object{public:int Oadd(int a, int b) { return a + b; }static int OSadd(int a, int b) { return a + b; }int operator()(int a, int b) { return a + b; }};typedef std::function<int(int, int)> func;int main(){Object obj;//std::function<int(int, int)> func = add; //普通函数func f1 = add;cout << f1(10, 20) << endl;//函数指针Fp_Type fp = add;func f2 = fp;cout << f2(10, 20) << endl;//类成员函数func f3 = std::bind(&Object::Oadd,obj, placeholders::_1, placeholders::_2);cout << f3(10, 20) << endl;//类静态函数func f4 = Object::OSadd;cout << f4(10, 20) << endl;//仿函数func f5 = obj;cout << f5(100, 200) << endl;return 0;}

运行结果:

示例:

void add1(int& a, int b){cout << "add: a = " << a << " b = " << b << endl;a++;b++;}int main(){int a = 10, b = 20;std::function<void(int&, int)> fun = add1;fun(a, b);cout << "main: a = " << a << " b = " << b << endl;fun(a, b);cout << "main: a = " << a << " b = " << b << endl;std::function<void(int&, int)> fun2 = bind(fun, placeholders::_1, placeholders::_2);fun2(a,b);cout << "main: a = " << a << " b = " << b << endl;fun2(a,b);cout << "main: a = " << a << " b = " << b << endl;return 0;}

结果:

add: a = 10 b = 20main: a = 11 b = 20add: a = 11 b = 20main: a = 12 b = 20add: a = 12 b = 20main: a = 13 b = 20add: a = 13 b = 20main: a = 14 b = 20请按任意键继续. . . (2)作为回调函数和参数使用 class A{private:std::function<void()> call_back;public:A(const std::function<void()> &f):call_back(f){}A(){}void notify(){call_back(); //回调到上层}};class Foo{public:void operator()(){cout << "hello jqw" << endl;}};int main(){Foo foo;//std::function<void()> f = foo;A a(foo);a.notify();return 0;}

执行结果:

hello jqw 四、关于回调函数

回调就是通过把函数等作为另外一个函数的参数的形式,在调用者层指定被调用者行为的方式。

通过上面的介绍,我们知道,可以使用函数指针,以及std::function作为函数参数类型,从而实现回调函数.

参考:http://uusama.com/735.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。