回调函数其实就是以函数指针做函数参数传递给另一个函数,在另一个函数执行的时候可以根据函数指针执行回调函数的代码。

以下介绍两种回调函数的形式,
- 一种是简单的以函数指针传递的形式
- 另一种是C++11特性的std::bindstd::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;
}