C++实现将类内非静态成员函数作为回调函数

前言

       以成员函数指针作为模板参数,实现类似C#的Delegate机制,把逻辑整理一下,类似Java的事件驱动设计。

代码

#ifndef MY_BASE_H
#define MY_BASE_H

class Base
{
public:
    virtual int Add(int a, int b) = 0;
    virtual int Mul(int a, int b) = 0;
    virtual int Sub(int a, int b) = 0;
};

#endif

#ifndef MY_CHILD_H
#define MY_CHILD_H

#include "Base.h"

class Child :public Base
{
public:
    int Add(int a, int b);
    int Mul(int a, int b);
    int Sub(int a, int b);
};

#endif

#include "Child.h"

int Child::Add(int a, int b)
{
    return a + b;
}

int Child::Mul(int a, int b)
{
    return a * b;
}

int Child::Sub(int a, int b)
{
    return a - b;
}

#ifndef _CDELEGATE_H
#define _CDELEGATE_H  

#include "Base.h"

class CDelegate
{
    typedef int(Base::* Calculate)(int, int);
public:
    void Set(Base *pb, Calculate func)
    {
        this->pb = pb;
        this->CFunc = func;
    }

    int Call(int a, int b)
    {
        return (pb->*CFunc)(a, b);
    }
private:
    Base *pb = nullptr;
    Calculate CFunc;
};

#endif

#include <iostream>

#include "Base.h"
#include "Child.h"
#include "CDelegate.h"

int main()
{
    using namespace std;

    CDelegate del;

    Base *pb = new Child();
    del.Set(pb, &Base::Add);
    cout << del.Call(5, 4) << endl;
    del.Set(pb, &Base::Mul);
    cout << del.Call(5, 9) << endl;
    delete pb;

    system("pause");
    return 0;
}

Reference

《深入实践 C++模板编程 温宇杰 著》

C++ 实现把非静态成员函数作为回调函数(非static)(转) 

C++简易模仿C#Delegate机制

你可能感兴趣的:(C++实现将类内非静态成员函数作为回调函数)