C++中delegate(委托)的实现

本文介绍了C++中如何实现委托(delegate),包括本地回调、成员回调和委托的使用。通过示例展示了如何添加、移除回调函数,以及如何使用委托调用不同类型的函数和成员方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

delegate.h
#ifndef WAN_DELEGATE_H
#define WAN_DELEGATE_H
  
/**
 * @author Kevin Wan <wanjunfeng@gmail.com>
 * @date   06/30/2005
 * Copyright (C) Kevin Wan
 */
#include "threadingmodel.h"
  
namespace wan
{
namespace local
{
template <typename> class ICallback;
template <typename> class NativeCallback;
template <typename, typename> class MemberCallback;
} // namespace local

template <typename, typename LockType = void> class delegate;

#define DELEGATE_GENERATOR(TEMPLATE_LIST, TYPE_LIST, TYPE_PARAM_LIST, PARAM_LIST) /
namespace local /
{ /
template <typename ReturnType TEMPLATE_LIST> /
class ICallback<ReturnType(TYPE_LIST)> /
{ /
    typedef ICallback<ReturnType(TYPE_LIST)> SelfType; /
/
public: /
    virtual ~ICallback() {} /
/
    virtual ReturnType invoke(TYPE_LIST) const = 0; /
    virtual bool equals(const SelfType* pDelegate) const = 0; /
    virtual SelfType* clone() const = 0; /
}; /
/
template <typename ReturnType TEMPLATE_LIST> /
class NativeCallback<ReturnType(TYPE_LIST)> /
    : public ICallback<ReturnType(TYPE_LIST)> /
{ /
    typedef ICallback<ReturnType(TYPE_LIST)> SuperType; /
    typedef NativeCallback<ReturnType(TYPE_LIST)> SelfType; /
    typedef ReturnType (*FunctionPtr)(TYPE_LIST); /
/
public: /
    explicit NativeCallback(FunctionPtr ptr) /
        : m_handler(ptr) /
    { /
    } /
/
    NativeCallback(const SelfType& rhs) /
        : ICallback<ReturnType(TYPE_LIST)>(rhs) /
        , m_handler(rhs.m_handler) /
    { /
    } /
/
    ReturnType invoke(TYPE_PARAM_LIST) const /
    { /
        return (*m_handler)(PARAM_LIST); /
    } /
/
    bool equals(const SuperType* pDelegate) const /
    { /
        const SelfType* pRhs = dynamic_cast<const SelfType*>(pDelegate); /
        if (pRhs == 0) return false; /
        if (m_handler == pRhs->m_handler) return true; /
        return false; /
    } /
/
    SelfType* clone() const /
    { /
        return new SelfType(*this); /
    } /
/
private: /
    FunctionPtr m_handler; /
}; /
/
template <typename ObjectType, typename ReturnType TEMPLATE_LIST> /
class MemberCallback<ObjectType, ReturnType(TYPE_LIST)> /
    : public ICallback<ReturnType(TYPE_LIST)> /
{ /
    typedef ICallback<ReturnType(TYPE_LIST)> SuperType; /
    typedef MemberCallback<ObjectType, ReturnType(TYPE_LIST)> SelfType; /
    typedef ReturnType (ObjectType::*FunctionPtr)(TYPE_LIST); /
    typedef ReturnType (ObjectType::*ConstFunctionPtr)(TYPE_LIST) const; /
/
    enum { CONST_POINTER, NEED_DELETE, DONT_DELETE }; /
    struct ObjectManager /
    { /
        bool equals(const ObjectManager& rhs) /
        { /
            return object.pObject == rhs.object.pObject; /
        } /
/
        union { ObjectType* pObject; const ObjectType* pConstObject; } object; /
        int                 property; /
        int                 refCount; /
    }; /
/
public: /
    MemberCallback(ObjectType* t, FunctionPtr ptr, bool needDelete = false) /
        : m_isConstMemFunc(false) /
    { /
        m_pObjectManager = new ObjectManager(); /
        m_pObjectManager->object.pObject = t; /
        m_pObjectManager->property = needDelete ? NEED_DELETE : DONT_DELETE; /
        m_pObjectManager->refCount = 0; /
        m_handler.ptr = ptr; /
        incrementRefCount(); /
    } /
/
    MemberCallback(ObjectType* t, ConstFunctionPtr ptr, bool needDelete = false) /
        : m_isConstMemFunc(true) /
    { /
        m_pObjectManager = new ObjectManager(); /
        m_pObjectManager->object.pObject = t; /
        m_pObjectManager->property = needDelete ? NEED_DELETE : DONT_DELETE; /
        m_pObjectManager->refCount = 0; /
        m_handler.constPtr = ptr; /
        incrementRefCount(); /
    } /
/
    MemberCallback(const ObjectType* t, ConstFunctionPtr ptr) /
        : m_isConstMemFunc(true) /
    { /
        m_pObjectManager = new ObjectManager(); /
        m_pObjectManager->object.pConstObject = t; /
        m_pObjectManager->property = CONST_POINTER; /
        m_pObjectManager->refCount = 0; /
        m_handler.constPtr = ptr; /
        incrementRefCount(); /
    } /
/
    MemberCallback(const SelfType& rhs) /
        : ICallback<ReturnType(TYPE_LIST)>(rhs) /
        , m_pObjectManager(rhs.m_pObjectManager) /
        , m_handler(rhs.m_handler) /
        , m_isConstMemFunc(rhs.m_isConstMemFunc) /
    { /
        incrementRefCount(); /
    } /
/
    virtual ~MemberCallback() /
    { /
        decrementRefCount(); /
    } /
/
    ReturnType invoke(TYPE_PARAM_LIST) const /
    { /
        if (m_isConstMemFunc) /
        { /
            if (m_pObjectManager->property == CONST_POINTER) /
                return (m_pObjectManager->object.pConstObject->*(m_handler.constPtr))(PARAM_LIST); /
            return (m_pObjectManager->object.pObject->*(m_handler.constPtr))(PARAM_LIST); /
        } /
        return (m_pObjectManager->object.pObject->*(m_handler.ptr))(PARAM_LIST); /
    } /
/
    bool equals(const SuperType* pDelegate) const /
    { /
&nbs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值