zoukankan      html  css  js  c++  java
  • 2个函数宏技巧

     

    1.用宏调用对象函数

    #define FOR_EACH_OBSERVER(ObserverType, observer_list, func) 
        do{ 
          CObserverListBase<ObserverType>::Iterator it(observer_list); 
          ObserverType* obs; 
          while((obs=it.GetNext()) != NULL) 
            obs->func; 
        } while(0)
    

    调用方式

    //     void NotifyBar(int x, int y) {
    //       FOR_EACH_OBSERVER(Observer, observer_list_, OnBar(this, x, y));
    //     }

    2.用宏定义函数指针来转发

    定义:

    class TestDelegate
    {
    public:
        void Test(int i)
        {
            i=1;
        }
    
        void Test2(int i,int j)
        {
            i=1;
        }
    
        void (Test22)(int i,int j)
        {
            //((this)->*(&TestDelegate::Test))(i);
        }
    };
    
    #define __IMPLEMENT_COMSINK_FUNCTION(func, params, values) 
        typedef void (T::*F##func)params;
        void Hook_##func(F##func pf##func) 
    { 
        m_pf##func = pf##func; 
    } 
        void (func)params 
    { 
        ((m_pT)->*(m_pf##func))values; 
    } 
    private:
        F##func m_pf##func;
    
    template<typename T>
    class DelegateHandler
    {
    public:
        DelegateHandler(T* pT,void (T::*pFunc)(int))
            :m_pT(pT),m_pFunc(pFunc)
        {
    
        }
    
        __IMPLEMENT_COMSINK_FUNCTION(OnEvent,(int a,int b),(a,b))
    
    private:
        T* m_pT;
        void (T::*m_pFunc)(int);
    };
    
    

    调用

    TestDelegate td;
    DelegateHandler<TestDelegate> dh(&td,&TestDelegate::Test);
    dh.Hook_OnEvent(&TestDelegate::Test2);
    dh.OnEvent(4,3);
    
  • 相关阅读:
    Azure SQL Storage
    T-SQL quries
    映射盘符
    繁体及其输入法、乱码问题
    匈牙利命名法
    C++四种转换总结
    windows系统下进程间通信
    Qt 中文字符串问题
    PDB文件详解
    DbgView 无法开启Capture Kernel问题
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/3435435.html
Copyright © 2011-2022 走看看