使用std::function包装类成员函数

std::function

std::function是一个函数包装器模板,最早来自boost库,对应其boost::function函数包装器。在c++11中,std::function能包装任何类型的可调用元素,可以包装:函数、函数指针、类成员函数指针或任意类型的函数对象。

包装类成员函数示例

#include <functional>
#include <iostream>

class Publisher
{
public:
    void RegistFunc(std::function<void(int, int)> func) {
        std::cout << "Publisher RegistFunc()" << std::endl;
        func(1, 2);
    }
};

class Subscriber
{
public:
    Subscriber(int a, int b) : a_(a), b_(b) {}

    virtual ~Subscriber(){};

    void Notify(int a, int b) {
        std::cout << "Notify: a = " << a << ", b = " << b << std::endl;
        this->a_ = a;
        this->b_ = b;
    }

    void Start() {
        std::cout << "Subscriber Start()" << std::endl;
        Publisher pub;
        std::function<void(int,int)> func = std::bind(&Subscriber::Notify, this, std::placeholders::_1, std::placeholders::_2);
        pub.RegistFunc(func);
    }

    void show() {
        std::cout << "show: a = " << a_ << ", b = " << b_ << std::endl;
    }

private:
    int a_;
    int b_;
};

int main(int argc, char* argv[])
{
    std::cout << "main start" << std::endl;
    Subscriber sb(5, 6);
    sb.show();
    sb.Start();
    sb.show();
    std::cout << "main end" << std::endl;
}

执行结果

main start
show: a = 5, b = 6
Subscriber Start()
Publisher RegistFunc()
Notify: a = 1, b = 2
show: a = 1, b = 2
main end

std::bind时,可以通过占位符,改变参数顺序。

//修改为
std::bind(&Subscriber::Notify, this, std::placeholders::_2, std::placeholders::_1);

执行结果

main start
show: a = 5, b = 6
Subscriber Start()
Publisher RegistFunc()
Notify: a = 2, b = 1
show: a = 2, b = 1
main end
  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: std::function是C++11中的一个函数对象包装器,它可以用来封装各种可调用实体,包括函数指针、函数对象以及成员函数等。它的主要作用是将函数或者函数对象存储起来,以便稍后调用。 std::function使用方法很简单,首先需要声明一个std::function对象,然后通过赋值或者绑定一个可调用实体来进行初始化。在调用时,可以像调用普通函数一样使用std::function对象。 例如,假设我们有一个函数func,它的参数是一个int型的整数,返回值是一个字符串。我们可以先定义一个std::function对象funcWrapper,然后将func赋值给它,接着通过调用funcWrapper来使用func。 std::bind是C++11中的一个函数对象适配器,它可以用来修改或者重排函数的参数顺序。它接受一个可调用实体以及一系列参数,然后返回一个新的函数对象。这个新的函数对象可以像原始的可调用实体一样进行调用。 std::bind使用方法也很简单,首先需要声明一个std::function对象,然后使用std::bind将可调用实体以及参数绑定到该std::function对象上。在调用时,可以像调用普通函数一样使用std::function对象。 例如,我们有一个函数add,它接受两个整数作为参数,返回它们的和。我们可以使用std::bind将add函数绑定到一个std::function对象上,并将其中一个参数设置为常数10。然后,在调用时,我们只需要提供另一个参数即可。 综上所述,std::functionstd::bind是C++11中非常有用的函数对象封装器和函数对象适配器。它们可以帮助我们更灵活地处理函数对象,并且可以简化代码的编写和阅读。 ### 回答2: std::functionstd::bind是C++11中引入的函数对象的概念和相关功能的标准库组件。 首先,std::function 是一个通用的函数封装器,可以包装各种可调用对象,比如普通函数、函数指针、成员函数、lambda表达式等。通过使用std::function,我们可以像使用普通函数一样,对这些可调用对象进行传递、存储等操作。例如: ```cpp #include <iostream> #include <functional> void printHello() { std::cout << "Hello\n"; } int add(int a, int b) { return a + b; } int main() { std::function<void()> func1 = printHello; func1(); // 输出 Hello std::function<int(int, int)> func2 = add; std::cout << func2(1, 2) << std::endl; // 输出 3 return 0; } ``` 其次,std::bind 是一个函数适配器,可以将可调用对象与其参数进行绑定,生成一个新的可调用对象。通过使用std::bind,我们可以将函数的部分参数绑定为特定的值,从而修改函数的行为或者改变函数的接口。例如: ```cpp #include <iostream> #include <functional> void printSum(int a, int b) { std::cout << "Sum: " << a + b << std::endl; } int main() { auto bindFunc = std::bind(printSum, 1, std::placeholders::_1); bindFunc(2); // 输出 Sum: 3 return 0; } ``` 在上面的例子中,使用std::bind将printSum函数的第一个参数绑定为1,生成了一个新的可调用对象bindFunc。当调用bindFunc(2)时,实际上就是调用了printSum(1, 2),输出了"Sum: 3"。 通过使用std::functionstd::bind,我们可以更加灵活地处理函数对象和参数的相关操作,增强了C++中函数式编程的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值