std::function 与 std::bind解决类成员函数作为回调函数的问题

发布时间 2023-11-24 10:24:43作者: 左边的翼

1、std::function

  std::function是一个模板类,其可对C++可调用的对象进行封装,比如,成员函数、静态函数等;它的基本作用是简化调用的复杂程度,归一化调用方式。

  std::function<int(int, int)> int_function:声明方式为<返回值类型(参数类型1,参数类型2,...)>,其可封装任何可调用的对象,只需要将可调用的对象作为右值赋值给它:

  int add_function(int a, int b)

  {

    return a+b;

  }

  std::function<int(int,int)> addFunc = add_function;

  std::function怎么与类成员函数建立联系,需要通过std::bind进行建立联系。

2、std::bind

  std::bind是一个基于模板的函数,它的作用是绑定并返回一个std::function对象;std::bind是模板函数,std::function是模板类,std::bind返回可直接给std::function,std::function可以包装类成员函数,其无法生成类成员函数可调用的对象,通过std::bind可以生成类成员函数可调用的对象。

  std::bind绑定普通函数:std::bind(&函数名,std::placeholders::_1, ...),绑定普通成员函数时,参数1是函数名,后续是函数的参数列表,参数的书写方式是std::placeholders::_1,std::placeholders::_2,...;

  std::bind类成员函数:std::bind(&类名::函数名,类对象指针,std::placeholders::_1, ...),绑定类成员函数时,参数1是类成员函数的引用,参数2是类对象指针,后续为函数参数列表。

3、示例程序

#include <iostream>
#include "CommonFunctions.h"
#include <functional>
int add_function(int a, int b)
{
    return a + b;
}

int bind_add_function(int a, int b)
{
    return a + b;
}

int main()
{
    std::function<int(int, int)> addFunc = add_function;
    std::function<int(int, int)> bindAddFunc = std::bind(&bind_add_function, std::placeholders::_1, std::placeholders::_2);
    std::shared_ptr<CommonFunctions> cf = std::make_shared<CommonFunctions>();
    std::function<int(int, int)> classBindAddFunc = std::bind(&CommonFunctions::add_test, cf, std::placeholders::_1, std::placeholders::_2);
    std::cout <<"addFunc: "<< addFunc(5,6);
    std::cout << "\r\n";
    std::cout <<"bindAddFunc: "<<bindAddFunc(6, 6);
    std::cout << "\r\n";
    std::cout << "classBindAddFunc: " << classBindAddFunc(6, 7);
    std::cout << "\r\n";
    system("pause");
}

 

std::bind(&funcName, std::placeholders::_1, ...);