本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ 回调函数
原文链接:https://www.stubbornhuang.com/915/
发布于:2020年09月23日 16:43:10
修改于:2020年10月31日 16:44:14
回调函数其实就是以函数指针做函数参数传递给另一个函数,在另一个函数执行的时候可以根据函数指针执行回调函数的代码。
以下介绍两种回调函数的形式,
- 一种是简单的以函数指针传递的形式
- 另一种是C++11特性的std::bind和std::function来实现更加简单的回调函数
1 函数指针
简单示例,便于理解,防止遗忘。
#include <iostream>
typedef double (*CallbackFunction)(double a, double b); // 回调函数指针
void CallCallbackFunction(CallbackFunction p_Function) // 调回调函数
{
CallbackFunction tempCallFunction = NULL;
tempCallFunction = p_Function;
double sum = tempCallFunction(1, 3);
std::cout << "CallbackFunction 的回调结果=" << sum << std::endl;
}
double Add(double a, double b) // 回调函数
{
return a + b;
}
int main()
{
CallCallbackFunction(Add);
getchar();
return 0;
}
2 std::bind和std::function实现回调函数
简单示例,避免遗忘
#include <iostream>
#include <functional>
#include <memory>
#include <thread>
using namespace std;
typedef std::function<void(int a,int b)> AddFunc;
class A
{
public:
typedef std::shared_ptr<A> ptr;
A()
{
};
virtual~A()
{
};
public:
void SetAddFunc(AddFunc func)
{
m_AddFunc = func;
}
void AddThread()
{
std::shared_ptr<std::thread> threadPtr = std::make_shared<std::thread>([this]() {
int count = 0;
while (count<10)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
if (m_AddFunc != nullptr)
{
m_AddFunc(1, 2);
count += 1;
}
}
});
threadPtr->join();
}
private:
AddFunc m_AddFunc;
};
class B
{
public:
B()
{
if (m_pAPtr == nullptr)
{
m_pAPtr = std::make_shared<A>();
if (m_pAPtr != nullptr)
{
m_pAPtr->SetAddFunc(std::bind(&B::AddFuncCallback, this, std::placeholders::_1, std::placeholders::_2));
m_pAPtr->AddThread();
}
}
};
virtual~B()
{
}
private:
void AddFuncCallback(int a, int b)
{
std::cout << "A的函数回调" << std::endl;
};
private:
A::ptr m_pAPtr;
};
int main()
{
B t_B;
return 0;
}
当前分类随机文章推荐
- C++ - 使用模板和智能指针构建一个双向链表工具类 阅读961次,点赞0次
- C++ - 使用ffmpeg读取视频旋转角度并使用OpenCV根据旋转角度对视频进行旋转复原 阅读1889次,点赞0次
- C++ - 阿拉伯数字字符串转换为中文读法的中文字符串,支持小数点 阅读1343次,点赞0次
- C++ - std::string输出双引号到字符串 阅读3224次,点赞0次
- C++ - 将Unicode std::wstring字符串转换为Unicode std::string转义字符,类似于\uxxxx的形式 阅读1609次,点赞0次
- C++ - 字节数组byte[]或者unsigned char[]与int的相互转换 阅读7123次,点赞1次
- C++ - 在CTC解码算法后移除相邻重复和blank索引 阅读405次,点赞0次
- C++11 - std::function简要介绍以及可包装函数的几种形式总结 阅读3218次,点赞0次
- C++ - const修饰符与指针 阅读375次,点赞1次
- C++ - 格式化json字符串,方便展示json字符串的层次结构 阅读2972次,点赞0次
全站随机文章推荐
- C++ – 字节数组byte[]或者unsigned char[]与long long的相互转换 阅读1698次,点赞0次
- C++ - 随机洗牌算法,std::random_shuffle和std::shuffle 阅读1593次,点赞2次
- 深度学习 - CTC算法原理详解 阅读699次,点赞0次
- Centos7 - 防火墙操作以及开启和关闭特定端口 阅读4370次,点赞2次
- 资源分享 - Geometric and Discrete Path Planning for Interactive Virtual Worlds 英文高清PDF下载 阅读747次,点赞0次
- WordPress - 在文章页顶部加入百分比阅读滚动进度条 阅读965次,点赞2次
- WordPress - 查询当前登录用户在一天之内的评论总数量 阅读2081次,点赞0次
- 资源分享 - Handbook of Discrete and Computational Geometry, First Edition 英文高清PDF下载 阅读1629次,点赞2次
- C++ - 对字符串和图片进行base64编解码 阅读320次,点赞0次
- Youtube运营 - 申请开通YPP(Youtube合作伙伴计划)时,人工审核未通过,理由为再利用他人的内容 阅读288次,点赞0次
评论
169