【C++11】 包装器 | bind

这篇具有很好参考价值的文章主要介绍了【C++11】 包装器 | bind。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 包装器

概念理解

function包装器 也被叫做 适配器
C++11中function本质是类模板,也是一个包装器

意义在于 对可调用对象类型进行封装再适配

可调用对象:函数指针 / lambda / 仿函数


用法

需要包含 头文件 functional

【C++11】 包装器 | bind,C++,c++,开发语言

模板参数
Ret : 被调用函数的返回类型
…Args作为参数包,这个参数包中包含0到任意个模板参数
Args… :被调用函数的形参


【C++11】 包装器 | bind,C++,c++,开发语言

f作为函数指针,Functor作为一个类 ,两者类型是完全不同的,
想要声明出统一的类型,就需要借助包装器进行包装,从而适配出统一的可调用对象的类型

function<int(int,int)>
第一个int作为返回值 小括号中的两个int参数,作为被调用函数的参数
此时既可以使用函数指针进行初始化,也可以使用仿函数进行初始化


【C++11】 包装器 | bind,C++,c++,开发语言

对于产生的包装器对象v1和v2,两者的类型是相同
但在调用时,一个调用的是f函数,一个调用的是Functor中的operator()


【C++11】 包装器 | bind,C++,c++,开发语言

包装器作为map的第二个参数
包装器的返回值为int类型,被调用函数有两个int的参数
可以将 f (函数指针) 、 Functor (仿函数)、 lambda表达式 作为可调用对象 传给包装器 ,对包装器进行初始化

成员函数的包装

成员函数中分为静态成员函数和非静态成员函数

静态成员函数

【C++11】 包装器 | bind,C++,c++,开发语言

对于静态成员函数,可以直接使用包装器 function
通过Plus这个类去寻找到plusi 这个函数 ,对包装器 进行初始化即可

非静态成员函数

【C++11】 包装器 | bind,C++,c++,开发语言

对于普通成员函数,是没办法直接使用 function包装器的
普通成员函数在类中有 this指针存在, 所以要在main函数中要加入 Plus


【C++11】 包装器 | bind,C++,c++,开发语言

这里不是直接去调用plusd这个函数的, 而是通过Plus对象去调用 plusd


【C++11】 包装器 | bind,C++,c++,开发语言

这里不是直接去调用plusd这个函数的, 而是通过指针去调用 plusd
若为plus*,则匿名对象是需要取地址的
而匿名对象属于右值,不能取地址 ,
所以使用Plus*,不能使用匿名对象


【C++11】 包装器 | bind,C++,c++,开发语言

最后加入&后, 即可解决 问题 (加&是规定)

2. bind

概念理解

bind函数 定义在头文件中,是一个函数模板

bind函数可以看作一个通用的函数适配器,它接受一个可调用对象(函数指针 仿函数 lambda对象)
生成一个新的可调用对象来 适应 原对象的参数列表


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

arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是占位符,
_1表示第一个参数,_2表示第二个参数 ,但默认情况下获取不到 (_1 和_2被放到命名空间中)

【C++11】 包装器 | bind,C++,c++,开发语言

绑定的参数被放到 placeholders


【C++11】 包装器 | bind,C++,c++,开发语言

placeholders 命名空间中,有_1 _2 _3等 符号存在
所以想使用_1表示第一个参数 ,需在placeholders命名空间中访问_1 即 placehlders::_1

功能1 调整参数顺序 (用处不大)

【C++11】 包装器 | bind,C++,c++,开发语言

正常情况下,把1传给参数a,把2传给参数b ,打印a=1 b=2


若想把1传给参数b,把2传给参数a ,则使用bind

【C++11】 包装器 | bind,C++,c++,开发语言

bind的第一个参数为可调用对象
bind的参数包作为占位符,借助placeholders 命名空间 来访问里面的字符(_1 _2)

把Sub1函数中的第二个参数2传给Sub函数的a
把Sub1函数中的第一个参数1传给Sub函数的b

绑定后 会返回一个可调用对象, 可以选择使用auto 自动推导类型
再通过返回的对象,再次调用1 2 ,则结果不同


功能2 调整参数个数

【C++11】 包装器 | bind,C++,c++,开发语言

在Sub类中的 func函数,虽然看似只有两个参数,但是还有一个隐藏的this指针存在


【C++11】 包装器 | bind,C++,c++,开发语言

若使用包装器,则需三个参数,通过匿名对象去调用func函数


function中的参数个数与 func的参数个数 不同
若想两者参数个数相同,则需要绑定,进行调整参数的个数

bind可以把某个参数绑死 (把其中一个参数显示传过去)

【C++11】 包装器 | bind,C++,c++,开发语言
把匿名对象显示传过去,此时匿名对象就绑死了
placehlders::_1和 placehlders::_2 表示剩下的两个参数
可调用对象 只需 传递两个参数 即可
文章来源地址https://www.toymoban.com/news/detail-517000.html

到了这里,关于【C++11】 包装器 | bind的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++11 function包装器

    在C++中,有三种 可调用对象 :函数指针,仿函数,lambda表达式。 三者有相似的作用和效果,但使用形式有很大的差异。 为了进行统一,C++11引进了 function包装器 首先,要想使用function,需要包含functional这个头文件 function包装器本质是一个 类模板 以往,如果要实现一个加法

    2024年02月13日
    浏览(50)
  • 【C++】C++11 ~ 包装器解析

    (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是 Scort 目前状态:大三非科班啃C++中 🌍博客主页:张小姐的猫~江湖背景 快上车🚘,握好方向盘跟我有一起打天下嘞! 送给自己的一句鸡汤🤔: 🔥真正的大师永远怀着一颗学徒的心 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 🎉🎉

    2024年02月01日
    浏览(34)
  • 【C++11】lambda表达式 包装器

    在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法: 如果待排序元素为自定义类型,需要用户定义排序时的比较规则: 如果仿函数命名比较规范的话,像上面的命名方式的话那还好,如果遇到了像cmp1 cmp2 cmp3…这种命名方式而且还没有注释的话可以

    2024年02月12日
    浏览(42)
  • 【C++】C++11:线程库和包装器

    C++11最后一篇文章 文章目录 前言 一、线程库 二、包装器和绑定 总结 上一篇文章中我们详细讲解了lambda表达式的使用,我们今天所用的线程相关的知识会大量的用到lambda表达式,所以对lambda表达式还模糊不清的可以先将上一篇文章看明白。 一、线程库 在 C++11 之前,涉及到

    2024年02月10日
    浏览(45)
  • C++ 11新特性之bind

    概述         std::bind是C++ 11中functional头文件提供的一个函数模板,它允许我们将函数或成员函数与其部分参数预先绑定在一起,形成一个新的可调用对象(英文为:Callable Object)。这个新的可调用对象可以在后续时机以剩余参数完成调用,这个机制对于事件处理、回调函

    2024年02月21日
    浏览(38)
  • 【C++干货铺】C++11新特性——lambda表达式 | 包装器

    ========================================================================= 个人主页点击直达:小白不是程序媛 C++系列专栏:C++干货铺 代码仓库:Gitee ========================================================================= 目录 C++98中的排序 lambda表达式 lambda表达式语法 表达式中的各部分说明 lambda表达式的使

    2024年01月21日
    浏览(41)
  • 【C++】c++11新特性(二)--Lambda函数及function(包装器)

    目录 Lambda函数 基本概念 基本语法 lambda 捕获(capture) 1. 不捕获任何变量 2. 按值捕获 3. 按引用捕获 4. 混合捕获 5. 捕获this 指针 包装器 function 基本概念 使用场景 1. 给function对象赋值  2. 作为函数参数和返回值   3. 存储在容器中 4. 绑定成员函数和带参数的函数        la

    2024年04月27日
    浏览(39)
  • 【C++进阶】C++11(下)可变参数模板&lambda表达式&包装器

    我们紧接着上一节的讲解来进行 C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧

    2024年04月11日
    浏览(86)
  • C++11的std::function和bind绑定器

            在C++中,存在“可调用对象”这么一个概念。准确来说,可调用对象有如下几种定义:                 1、是一个函数指针                 2、是一个具有operator()成员函数的类对象(仿函数)                 3、是一个可转换为函数指针的类对象            

    2024年02月08日
    浏览(37)
  • R语言【cli】——ansi_strwrap():将ANSI样式的字符串包装为一定的宽度

    Package  cli  version 3.6.0 这个函数类似于base::strwrap(),但它适用于ANSI样式的字符串,并且保持样式不变。 参数【x】 :ANSI字符串。 参数【width】 :换行到的宽度。 参数【indent】 :每段第一行的缩进。 参数【exdent】 :缩进每段后面的行。 参数【simplify】 :是否在单个字符向

    2024年01月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包