回调函数其实就是以函数指针做函数参数传递给另一个函数,在另一个函数执行的时候可以根据函数指针执行回调函数的代码。
以下介绍两种回调函数的形式,
- 一种是简单的以函数指针传递的形式
- 另一种是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;
}
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ 回调函数
原文链接:https://www.stubbornhuang.com/915/
发布于:2020年09月23日 16:43:10
修改于:2023年06月26日 22:15:55
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
50