首页 > 其他分享 >std::function 与 std::bind解决类成员函数作为回调函数的问题

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

时间:2023-11-24 10:34:47浏览次数:24  
标签:std function 函数 int bind placeholders

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, ...);

标签:std,function,函数,int,bind,placeholders
From: https://www.cnblogs.com/missyou0813/p/17852119.html

相关文章

  • 工作常用的EXCEL公式 | vlookup和match函数的应用
    数据源:返回多列结果: ......
  • C++ lambda 内 std::move 失效问题的思考
    最近在学习C++Move时,有看到这样一个代码需求:在lambda中,将一个捕获参数move给另外一个变量。看似一个很简单常规的操作,然而这个move动作却没有生效。具体代码如下std::vector<int>vec={1,2,3};autofunc=[=](){autovec2=std::move(vec);std::cout......
  • pythonChap3变量与函数
    变量与操作变量用=赋值新的值会覆盖掉旧的值新值的数据类型不一定要与旧的相等变量命名规则:必须以字母或下划线(_)开头命名可由字母、数字和下划线组成大小写敏感尽量避免使用保留字命名保留字:['False','None','True','peg_parser','and','as','assert','async......
  • Delphi获取当前系统时间(使用API函数GetSystemTime)
    在开发应用程序时往往需要获取当前系统时间。尽管Y2K似乎已经平安过去,但在我们新开发的应用程序中还是要谨慎处理“时间”问题。在《融会贯通--Delphi4.0实战技巧》(以下简称“该书”)第89页专门介绍了两种获取当前系统时间的方法,但这两种方法都存在不足或错误,以下就此进行讨......
  • 聪明办法学python chap2数据类型与操作 3变量与函数
    Python(二)数据类型与操作类型print(type(2))#整型intprint(type(2.2))#浮点型floatprint(type(2>3.4))#布尔型boolprint(type(type(2)))#类型typeprint(t......
  • shell脚本——函数与数组
    函数函数和别名很像有些脚本会被反复使用alias脚本比较复杂函数脚本的别名使用函数可以避免代码重复,增加可读性,简化脚本定义函数名(){脚本}function函数名(){脚本}先定义在调用#!/bin/bashos(){ifgrep-iqcentos/etc/os-releasethenecho"该系统是cento......
  • Python Chap3 变量与函数
    #变量与函数##变量1.变量是一个**名字**,它所指代的是一段数据2.使用=来对这段数据的区域进行赋值x=53.新的值会覆盖掉旧的值4.新值的数据类型不必与旧值相同##变量命名规则1.必须以字母或者下划线_开头2.命名可由字母,数字或下划线组成3.大小写敏感4.尽量避免使......
  • JavaScript字符串函数,都在这里了
    先来一波JavaScript提供了许多内置的字符串函数,用于处理和操作字符串。下面是一些常用的字符串函数的总结:length:返回字符串的长度。varstr="Hello";varlen=str.length;//返回5concat:将多个字符串连接起来。varstr1="Hello";varstr2="World";varresul......
  • 变量与函数Variables and Functions
    Task04:变量与函数VariablesandFunctions变量Variables变量是一段数据,用"="对某个变量名赋值新的值会覆盖掉旧的值新值的数据类型不必与旧值相同x=5print(x)x="data"print(x)data变量命名规则:必须以字母或下划线(_)开头命名可由字母、数字和下划线组成大小写敏感......
  • Fortran 中write函数用法详解及格式化输出简介
    目录write函数用法详解及格式化输出简介write的最基础用法print格式化输出常用格式控制符详解Iw.[m]Fw.dEw.d[Ee]Dw.dAwnXLw字符串/不常用格式控制符详解Gw.d[Ee]TcTLnTRnSP,SSBN,BZkPBw[.m]Ow[.m]Zw[.m]使用print进行格式化输出附录format命令格式控制符号表参考write函数......