当前位置: 首页 > wzjs >正文

部门网站建设工作总结seo短视频入口

部门网站建设工作总结,seo短视频入口,北京通信管理局网站备案,做网站文字要求文章目录 函数对象函数适配器bindbind的重载问题bind的引用问题 mem_fnfunction C标准库提供了函数对象和函数适配器功能 函数对象 许多标准库算法都接受函数对象(或函数)参数,用来控制其工作方式。常见的函数对象包括——比较标准、谓词&am…

文章目录

    • 函数对象
    • 函数适配器
      • bind
        • bind的重载问题
        • bind的引用问题
      • mem_fn
      • function

C++标准库提供了函数对象和函数适配器功能

函数对象

许多标准库算法都接受函数对象(或函数)参数,用来控制其工作方式。常见的函数对象包括——比较标准、谓词(返回bool的函数)和算术运算。标准库在<functional>中提供了一些常用的函数对象,这部分直接参考:Standard library header。

函数适配器

所谓函数适配器就是就受一个函数参数,返回一个可以用来调用该函数的函数对象。
适配器bind和mem_fn进行实参绑定,也成为柯里化(Currying)或部分求值(partial evaluation)。

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

bind

g=bind(f, arg):g(arg2)等价与f(arg3),其中arg3是通过arg2中的实参替换arg中对应的占位符得到的。

给定一方额函数和一组实参,bind()生成一个可用该函数剩余实参(如果存在)调用的函数对象。
例如:

int func0()
{std::cout << "func0" << std::endl;return 0;
}void func(int a, int b, int c)
{std::cout << a << "," << b << "," << c << std::endl;
}std::function<int(void)> f0 = std::bind(func0);// 也可以使用auto来避免冗余的类型声明std::cout << f0() << std::endl;// 利用占位符告知bind实参在结果函数对象中应该放到什么位置std::function<void(int, int, int)> f =std::bind(func, std::placeholders::_1, std::placeholders::_2,std::placeholders::_3);f(1, 2, 3);std::function<void(int, int)> f2 =std::bind(func, 6, std::placeholders::_1, std::placeholders::_2);f2(1, 2);

运行结果:

func0
0
1,2,3
6,1,2
bind的重载问题

同时,如果要绑定存在重载的函数的参数,必须显式说明绑定的是哪个函数:

int func2(int, int);
double func3(double, double);auto f = std::bind((double(double,double))func2, std::placeholders::_1, 2);
bind的引用问题

另外,bind接受普通表达式做参数,着导致对引用参数而言,在bind看到他们的时候已经被解引用了。

void inc_func(int &i)
{i++;
}
void add_func(int &a, int b)
{a += b;
}auto f_incr = std::bind(inc_func, std::placeholders::_1);int i = 0;inc_func(i);std::cout << i << std::endl;f_incr(i);std::cout << i << std::endl;auto f_add = std::bind(add_func, i, std::placeholders::_1);f_add(3);std::cout << i << std::endl;

运行结果:

1
2
2

从结果可以看出,bind的参数已经被解引用了。
为了解决这个问题,标准库提供了一对适配器:refcref,返回一个reference_wrapper。
上面的例子增加下面修订后:

auto f_add_ref =std::bind(add_func, std::ref(i), std::placeholders::_1);f_add_ref(4);std::cout << i << std::endl;

此时正确输出

1
2
2
6

同时,ref也被用于向thread传递引用参数,因为thread的构造函数是可变参数模板。

mem_fn

g=mem_fn(f):若p是一个指针,则g(p,args)表示p->f(args),否则g(p,args)表示p.f(args);args是一个(可能为空的)实参列表。

函数适配器mem_fn生成一个函数对象,可以作为非成员函数调用。
例如:

class A
{
public:void print(int a){std::cout << a << std::endl;}
};auto g = std::mem_fn(&A::print);A *a = new A;// 相当于调用了a->print(4)g(a, 4);

mem_fn的主要用途是服务于需要非成员函数的算法,例如:

void draw_all(vector<Shape *>& v)
{for_each(v.begin(), v.end(), mem_fn(&Shape::draw));
}

因此,mem_fn可以被看作从面向对象调用风格到函数式调用风格的一种映射
通常,lambda是比绑定器更简单也更通用的替代方案:

void draw_all(vector<Shape *>& v)
{for_each(v.begin(), v.end(), [](Shape *p){p->draw();});
}

function

如果要将bind的结果赋予一个特定类型的变量,可以使用标准库类型function。通过指明返回类型和参数类型来说明一个function:

std::function<int(void)> f0 = std::bind(func0);

标准库function是一种类型,它可以保存你能用调用运算符()调用的任何对象。即,一个function类型对象就是一个函数对象。这对回调、将操作作为参数传递等机制非常有用。

http://www.dtcms.com/wzjs/790.html

相关文章:

  • 做品牌设计网站我想做网络推广找谁
  • 互联网大赛建设网站策划书网络竞价推广开户
  • 温岭 网站建设seo百度seo排名优化软件
  • 外币信用卡怎么做网站上用企业seo顾问服务
  • 徐州市住房和城乡建设局网站首页网站的seo方案
  • 上海怎么做网站十大接单推广app平台
  • 广州建设网站的公司简介搜索引擎营销的优缺点
  • 哪个网站做签约插画师好百度词条官网入口
  • 网络推广软件排行网站推广seo教程
  • 要做未来科技的网站怎么做seo查询软件
  • 怎么在网站后台做图片新闻全网优化哪家好
  • 网站制作的语言网络软文范例
  • 网站建设平台招商重庆森林百度云
  • 为什么很多公司没自己的网站知乎关键词排名优化
  • 济南seo网站排名优化工具国内十大软件培训机构
  • 深圳前海自贸区注册公司政策北京搜索引擎优化seo专员
  • 网站线框图用什么做seo二级目录
  • 专业定制网站建设智能优化软文网站
  • jsp 移动web网站开发crm客户管理系统
  • 西安做网站哪家最便宜广州抖音推广
  • wordpress超好看主题奉节县关键词seo排名优化
  • 自做业务网站电商网站入口
  • 网站二级菜单是什么原因百度竞价开户3000
  • 龙岗这边哪里有教做网站的谷歌搜索引擎google
  • 做美甲批发的都上什么网站营销策划推广
  • 罗湖网站建设公司乐云seo最经典最常用的网站推广方式
  • 陕西省建设业协会网站合肥网络关键词排名
  • 十大免费客户管理系统佛山百度seo代理
  • 房产网站的全景图怎么做0元做游戏代理
  • 做网站后台指的那网站优化的方法与技巧