《c++11学习笔记》 --- std::function和bind绑定器

目录

std::function

 bind绑定器


 std::function

std::function是可调用对象,是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。可以用统一的方式处理函数、函数对象、函数指针。

可调用对象:

1)是一个函数指针。

2)是一个具有operator()成员函数的类对象(仿函数)。

3)是一个可被转换为函数指针的类对象。

4)是一个类成员(函数)指针。

//头文件
#include<functional>

void func(void)
{
    cout<<"func";
}

class Foo
{
public:
    static int foo_func(int a)
    {
        return a;
    }
};

class Foo1
{
public:
    int operaror()(int a)
    {
        return a;
    }
};

//绑定一个普通函数
std::function<void(void)> f = func;    
f();

//绑定类的静态成员函数
std::function<int(int)> f1 = Foo::foo_func;    
f1(11);


Foo1 foo1;
f1 = foo1;    //绑定仿函数
f1(11);

std::function作为回调函数

class A
{
    std::function<void()> callback_;
public:
    A( const std::function<void()>& f):callback_(f)
    {
    }
    void notify(void)
    {
        callback_();   //回调到上层
    }
};

class B
{
public:
    void operator()(void)
    {
        cout<<"123"<<endl;
    }
};

B b;
A a(b);
a.notify();

 bind绑定器

std::bind用来将可调用对象(std::function)与其参数一起进行绑定。绑定后的结果可以使用std::function进行保存,并延迟调用到任何我们需要的时候。
主要有两大作用:
1)将可调用对象与其参数一起绑定成一个仿函数。
2)将多元(参数个数为n,n>1)可调用对象转成一元或者(n-1)元可调用对象,即只绑定部分参数。

void call_even(int x, const std::function<void(int)>& f)
{
    if(!(x & 1))   //   x % 2 == 0
    {
        f(x);
    }
}

void output(int x)
{
    cout<< x <<endl;
}

auto f = std::bind(output, std::placeholders::_1);  
for(int i = 0; i < 10; ++i)
{
    call_even(i, f);
}

//std::placeholders::_1占位符,这个位置将在函数调用时,被传入的第一个参数所替代
//std::bind的返回值类型是一个stl内部定义的仿函数类型

两者结合使用:

class A
{
public:
    int i = 0;
    void output(int x, int y)
    {
        cout<< "x:" << x << "y:" << y <<endl;
    }
};


//f的类型是std::function<void(int,int)>。通过使用std::bind,将A的成员函数output的指针和a绑定,并转换为一个仿函数放入f中存储。
A a;
std::function<void(int, int)> f = std::bind(&A::output, &a, std::placeholders::_1, 
                                       std::placeholders::_2);
f(1, 2);    // 1, 2


//std::bind将A的成员i的指针和a绑定,返回的结果被放入std:function<int&(void)>中存储,并可以在需要时修改访问这个成员。
A a;
std::function<int& (void)> f1 = std::bind(&A::i, &a);
f1() = 10;

cout<< a.i << endl;      //10


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值