std::bind绑定成员函数,std bind 成员函数

http://www.itjxue.com  2023-01-08 20:28  来源:未知  点击次数: 

C11新特性之std::function与std::bind

std::function其实就是一个 类模板 ,含有c的 函数指针 概念。

类模版std::function是一种通用、多态的函数封装。std::function的实例可以对 任何可以调用的目标实体 进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。

简要来说:std::function是将所有可调用的实体封装起来,形成了一个新的std::function对象,用户在使用的时候不需要再去一一调用实体,只需要使用新的std::function来调用各实体

如下,std::function作为 回调函数 使用,它可以调用任何有两个int形参的返回值为int的对象

又因为std::function兼容c的函数指针,所以它还包含函数指针应有的特性。但是它又和函数指针不同,函数指针只能指向一个函数,而 std::function可以指向任何可以被当做函数调用的对象

以下内容来自

因为调用initWithFunction会产生临时的std::function对象,属于右值,必须使用const,不然会报错

转移操作std::move效率更高

std::bind完成了实体和函数地址的绑定,因为它的参数里面既有对象指针,又有函数指针,从而制造了一个std::function,然后std::function只要能正确处理那个this指针,那就能完成正确地调用了

bind是一种机制,可以预先把指定的可调用的实体的某些参数绑定到已有的变量,产生一个新的可调用实体。

它作为一个通用函数适配器,接收一个可调用对象,生成一个新的可调用对象来 适应原对象的参数列表 。

比如,存在一个这样的函数check_size,因为这是一个二元函数,当我们要将它作为find_if的参数,会出错。因为find_if只接受一元函数,那么如何解决呢?

一个方法是Lambda表达式,还有一个方法就是使用std::bind

下面这个bind的函数只有一个占位符,即只需要传入一个参数。它将check_size的第二个参数绑定在sz上,sz的值就是check_size的第二个参数的值,而check_size第一个参数需要传入

如果现在我们调用g(3,5),那么就相当于bind(f,a,b,5,c,3);

所以_1相当于传递的第一个参数,_2相当于传递的第二个参数...以此类推。

需要注意: bind对于直接绑定的值,是以值传递的方式,对于用_1这类,是使用引用传递。bind的返回值是可以调用的实体,所以通常我们都会将它和function联合在一起使用。

有时候对于有些绑定的参数我们希望以引用方式传递,或者说要绑定的参数无法拷贝。

比如ostream 流对象是无法拷贝 的,那么我们希望将它传递给bind而不拷贝它,就需要使用 ref 。

ref返回一个对象,包含给定的引用,是可以拷贝的。

对于成员函数的绑定,我们一定需要一个调用者,也就是类的实例!

需要注意的是,bind 无法绑定重载函数 ,因为当重载函数的参数个数不相同时,bind也失去了它的意义。

在cocos2dx的源码中,我们经常可以看到function作为函数形参,而bind作为实参传入

如何用std:bind或boost:bind绑定类内静态方法

bind不是用来绑定方法的, 是用来绑定参数的, 也就是说对于一个需要两个参数functor, 执行一次bind后就得到一个只需要一个参数的functor. 如果你要把一个全局函数或者类的静态函数变成functior, 使用 std::ptr_fun

如何使用std:function指向类的成员函数

std::function可以绑定到全局函数或类的静态成员函数,如果要绑定到类的非静态成员函数,则需要使用std::bind。

void?F();

struct?A

{

????void?F(){}

};

std::functionvoid()?f1?=?F;?//全局函数

A?a;

std::functionvoid()?f2?=??std::bind(A::F,?a);?//成员函数

c++11里面的bind函数是什么鬼,看不懂,请高手指教

std::bind

简单调用(1)

template?class?Fn,?class...?Args

?/*?未指定?*/?bind?(Fn?fn,?Args...?args);

跟上返回值(2)

template?class?Ret,?class?Fn,?class...?Args

?/*?未指定?*/?bind?(Fn?fn,?Args...?args);

绑定(Bind)函数与参数的作用,

返回一个基于fn的函数对象,但是已经提前绑定了调用需要的参数。

调用这个函数对象相当于调用用绑定的参数调用fn。

下面给你一个使用例子吧:

//?bind?用例

#include?iostream

#include?functional

//?自定义的一个函数

double?my_divide?(double?x,?double?y)?{return?x/y;}

//?自定义的一个结构体

struct?MyPair?{

??double?a,b;

??double?multiply()?{return?a*b;}

};

int?main?()?{

??//?这个using是为了使用?_1,?_2,?_3,...

??using?namespace?std::placeholders;

??//?捆绑函数:

??auto?fn_five?=?std::bind?(my_divide,10,2);?//?返回?10/2

??std::cout??fn_five()??'\n';?//?输出?5

??auto?fn_half?=?std::bind?(my_divide,_1,2);?//?返回?x/2

??std::cout??fn_half(10)??'\n';?//?输出?5

??auto?fn_invert?=?std::bind?(my_divide,_2,_1);?//?返回?y/x

??std::cout??fn_invert(10,2)??'\n';?//?输出?0.2

??auto?fn_rounding?=?std::bindint?(my_divide,_1,_2);?//?返回?int(x/y)

??std::cout??fn_rounding(10,3)??'\n';?//?输出?3

??MyPair?ten_two?{10,2};

??//?捆绑成员函数:

??auto?bound_member_fn?=?std::bind?(MyPair::multiply,_1);?//?返回?x.multiply()

??std::cout??bound_member_fn(ten_two)??'\n';?//?输出?20

??auto?bound_member_data?=?std::bind?(MyPair::a,ten_two);?//?返回?ten_two.a

??std::cout??bound_member_data()??'\n';?//?输出?10

??return?0;

}

运行结果:

5

5

0.2

3

20

10

(责任编辑:IT教学网)

更多

推荐新手入门文章