您的位置:首页 > 科技 > IT业 > c++11---包装器

c++11---包装器

2024/11/17 20:44:37 来源:https://blog.csdn.net/2302_80221042/article/details/141868978  浏览:    关键词:c++11---包装器

function包装器

function包装器也叫作适配器。C++中的function本质是一个类模板。function可以包装所有可调用对象(仿函数,lambda表达式,函数指针)。

---------------------------------------------------------------------------------------------------------------------------------

格式如下:

function<x1(x2)>,x1处是要包装的对象的返回值类型,x2处写出要包装的对象的参数类型。如下:

这里要注意三点:

1.非静态成员函数的函数名不是函数地址,需要要加取地址符号才能得到函数地址。

2.普通成员函数具有隐藏的this指针这一参数,包装的时候要写上。

3.既然this是指针类型,为什么第二种包装方法把参数写成对象也可以,这是因为包装器底层其实是把可调用对象作为成员变量存起来,使用包装器时先调用包装器的operator()重载,把参数传给operator(),然后operator()利用参数调用这个对象,所以实际上,这里是operator()用Plus*或者Plus()调用被包装的可调用对象,而不论是对象还是对象指针都可以调用成员函数,所以两种都可以。

---------------------------------------------------------------------------------------------------------------------------------

bind

bind是一个函数模版,他可以在一个可调用对象的基础上改变其的参数个数,参数顺序,并返回一个新函数对象。

使用如下:

_1,_2,_3....._N,这些被包含在下面的命名空间

std::placeholders;

他们是传入新函数对象(即sub1)的参数的代号,比如说sub1传入了10,5,那么_1就是10,_2就是5,而sub1会调用调用sub,在sub中你可以把_1和_2的位置变换,那么sub接受到的参数顺序是5,10,从而间接实现改变参数顺序。

当然如果bind的时候把某些参数写成具体的值,那么调用sub时这个位置的参数永远是这个值,这时你只需要传入其它参数就可以了

需要注意的是:_1,_2..._N,代表的是第一,第二,第1N个传入新函数对象的参数:

这是错误的,因为根本没传第二个参数,10是第一个参数。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com