IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++回调函数使用和参数绑定std::bind函数的使用 -> 正文阅读

[C++知识库]C/C++回调函数使用和参数绑定std::bind函数的使用


最近在使用一个C语言库函数的时候,遇到一个问题:
该库函数有些函数设置了回调函数,
我构造了C++类, 想用其成员函数作为回调函数的参数赋值,
因为类方法有一个隐含参数this指针,无法直接作为回调使用,就想到了使用bind方法进行函参适配。结果证明是不可行的。
查阅了很多资料, 得 出 结 论 \color{red}{得出结论}
C语言的函数指针无法进行 C++ std::bind函数适配。😞
只用C++的std::function<函数类型>才能进行std::bind函数适配。


1 C普通回调函数实现

  1. 定义函数类型指针
  2. 在其他函数中使用该类型作为回调函数参数
#include <stdio.h>
typedef int (*callBack) (int a, int b);
callBack cfun;
int two_plus(int a, int b)
{
    return a + b;
}

void set_call_back(callBack func)
{
    cfunc = func;
}

int main()
{
    set_call_back(&two_plus);
    cfunc(1,2); //返回3
}

2 C++普通函数的回调方法

  1. 使用decltype也可以声明函数类型,作用同C语言的函数指针
  2. 使用C++ STL库 functional 的 std::funtion<函数类型>作为参数类型,既可以做回调函数参数,又可以进行std::bind 函数绑定——将不同参数的函数进行参数适配。
  • 我们看下面两个函数:
    • 函数一接受2个参数
    • 函数二接受3个参数
#include <iostream>
#include <functional>

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

int three_plus(int a, int b, int c)
{
    return a+b+c;
}
  • 使用decltype 方法,可以进行参数回调,但是无法将接受三参数的函数适配到函数参数中使用。

void cpp_set_call_back(decltype(two_plus) func) //ssdflakl
{
    //do something.
}

int main()
{
    cpp_set_call_back(&two_plus); //OK
    int x = 3;
    // down wrong
    cpp_set_call_back(std::bind(&three_plus,placeholders::_1, placeholders::_2, x));
}
  • 使用std::function<int (int, int)> 方法,可以使用bind方法,将三参数函数适配到二参数的函数上。
    其中,placeholders::_1,::_2是匹配位,作用是将 three_plus第一个参数 和第二个参数作为原函数的参数1和参数2。
void cpp_set_call_back(std::function<int(int, int)> func)
{
    //do something.
}

int main()
{
    cpp_set_call_back(&two_plus); //ok
    int x = 3;
    cpp_set_call_back(std::bind(&three_plus,placeholders::_1, placeholders::_2, x)); //ok
}

3 C++ 类成员函数作为回调函数使用

C++ 成员函数都有一个隐含参数this指针.如下的int ClassA::plus(int a, int b)函数,
其实作为回调,其应当接受三个参数即:int ClassA::plus(ClassA *this, int a, int b)

#include <iostream>
#include <functional>

class ClassA {
public:
    ClassA();
    void set_class_call_back(std::function<int(int, int)> func)
    {m_func = func;}
    int plus(int a, int b) {return a + b;}
    std::function<int(int, int)> m_func;
};
//1 .
ClassA::ClassA()
{
	//1. 成员函数作为回调函数,类内调用时,第一个参数需要填this指针。
    set_class_call_back(std::bind(&ClassA::plus, this, placeholders::_1, placeholders::_2));
}
int main()
{
    ClassA a;
    //2. 外部调用时,将类实例本身的地址作为this指针传入
    a.set_class_call_back(std::bind(&ClassA::plus, &a, placeholders::_1, placeholders::_2));

}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-24 15:05:50  更:2022-02-24 15:06:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:03:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码