当前位置: 七九推 > 互联网>阿里 > std::bind

std::bind

2022年06月23日 阿里 我要评论
std::bind是函数模板(是一个函数); 使用std::bind可以将可调用对象和参数一起绑定,绑定后的结果使用std::function进

std::bind是函数模板(是一个函数);

使用std::bind可以将可调用对象和参数一起绑定,绑定后的结果使用std::function进行保存,并延迟调用到任何我们需要的时候。

std::bind返回一个基于f的函数对象,其参数被绑定到args上。
f的参数要么被绑定到值,要么被绑定到placeholders(占位符,如_1, _2, ..., _n)。

即;可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

std::bind通常有两大作用:

将可调用对象与参数一起绑定为另一个std::function供调用

将n元可调用对象转成m(m < n)元可调用对象,绑定一部分参数。(即减少可调用对象传入的参数)。这里需要使用std::placeholders

比如:

int TestFunc(int a, char c, float f)

{
cout << a << endl;

cout << c << endl;

cout << f << endl;

return a;

}

auto bindFunc1 = bind(TestFunc, std::placeholders::_1, 'A', 100.1);

bindFunc1(10);

或者

auto bindFunc3 = bind(TestFunc, std::placeholders::_2, std::placeholders::_3, std::placeholders::_1);
 
bindFunc3(100.1, 30, 'C');
可以看到,在bind的时候,第一个位置是TestFunc,除了这个,参数的第一个位置为占位符std::placeholders::_2,这就表示,调用bindFunc3的时候,它的第二个参数和TestFunc的第一个参数匹配,以此类推。

1.std::bind绑定普通函数


double my_divide (double x, double y) {return x/y;}
auto fn_half = std::bind (my_divide,_1,2);  
std::cout << fn_half(10) << '\n';                        // 5
bind的第一个参数是函数名,普通函数做实参时,会隐式转换成函数指针。因此std::bind (my_divide,_1,2)等价于std::bind (&my_divide,_1,2);
_1表示占位符,位于<functional>中,std::placeholders::_1;


2.bind绑定类成员函数时

struct Foo {
    void print_sum(int n1, int n2)
    {
        std::cout << n1+n2 << '\n';
    }
    int data = 10;
};
int main() 
{
    Foo foo;
    auto f = std::bind(&Foo::print_sum, &foo, 95, std::placeholders::_1);
    f(5); // 100
}
bind绑定类成员函数时,第一个参数表示对象的成员函数的指针,第二个参数表示对象的地址。
必须显示的指定&Foo::print_sum,因为编译器不会将对象的成员函数隐式转换成函数指针,所以必须在Foo::print_sum前添加&;
使用对象成员函数的指针时,必须要知道该指针属于哪个对象,因此第二个参数为对象的地址 &foo;
 

3.绑定一个引用参数

std::bind的参数是以 拷贝的方式,使用 std::ref 的方式可以实现参数在std::bind的引用

4.指向成员函数的指针

#include <iostream>
struct Foo {
    int value;
    void f() { std::cout << "f(" << this->value << ")\n"; }
    void g() { std::cout << "g(" << this->value << ")\n"; }
};
void apply(Foo* foo1, Foo* foo2, void (Foo::*fun)()) {
    (foo1->*fun)();  // call fun on the object foo1
    (foo2->*fun)();  // call fun on the object foo2
}
int main() {
    Foo foo1{1};
    Foo foo2{2};
    apply(&foo1, &foo2, &Foo::f);
    apply(&foo1, &foo2, &Foo::g);
}
  • 成员函数指针的定义:void (Foo::*fun)(),调用是传递的实参: &Foo::f;
  • fun为类成员函数指针,所以调用是要通过解引用的方式获取成员函数*fun,即(foo1->*fun)();

 

(0)
打赏 微信扫一扫 微信扫一扫

相关文章:

  • 支付宝怎么绑定驾驶证?支付宝绑定驾驶证最新教程

    很多新手拿到驾照的时候想要将驾驶证绑定到支付宝上,那么今天小编就来教大家如何绑定,感兴趣的小伙伴就来学习一下吧。支付宝 for android v10.2.28 安卓手机版类型:生…

    2022年06月23日 阿里
  • 百度贴吧怎么清空浏览历史?

    大家都知道,百度贴吧是以兴趣主题聚合志同道合者的互动平台,那么怎么清空浏览历史呢,感兴趣的朋友不要错过了。方法1、在手机桌面点击【百度贴吧】图标2、进入贴吧后点击【我的】栏3、切换…

    2022年06月23日 阿里
  • 2021年4月20日700G福利码大全 最新阿里云盘福利码

    2021年4月20日700G福利码大全 最新阿里云盘福利码

    阿里云盘4月20日福利码是什么?全新可用的福利码来了哟,还没有领取的小伙伴赶紧来领取。这次的福利码一共有三个,一共可以扩容700g。是不是很激动呢?下面就来给大... [阅读全文]
  • Keep怎么查看个人账号二维码?Keep查看个人账号二维码教程

    keep怎么查看个人账号的二维码?很多小伙伴想要将自己keep上的个人账号二维码分享给好友,下面小编就教大家如何查看keep个人账号的二维码。keep健身软件 for androi…

    2022年06月23日 阿里
  • 会声会影怎么删除字幕? 会声会影去掉字幕的技巧

    会声会影如何删除字幕?该怎么删除字幕呢?下面我们就来看看会声会影删除字幕的技巧。开启“会声会影”软件。进入编辑区。导入项目文件。找到标题栏。鼠标右键单击要删…

    2022年06月23日 阿里
  • 云闪付怎么刷地铁? 地铁乘车码开通教程

    云闪付怎么刷地铁? 地铁乘车码开通教程

    云闪付绑定银联卡进行支付等,最近武汉地铁接通了云闪付,用户可以开通乘车码坐地铁,云闪付怎么刷地铁,小编为大家带来地铁乘车码开通教程。云闪付地铁乘车码开通教程银联... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2022  七九推 保留所有权利. 粤ICP备17035492号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com