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 dh(&td,&TestDelegate::Test);
dh.Hook_OnEvent(&TestDelegate::Test2);
dh.OnEvent(4,3);

Original: https://www.cnblogs.com/Clingingboy/p/3435435.html
Author: Clingingboy
Title: 2个函数宏技巧

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/551437/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 华为暑期实习通用软件开发面经

    华为暑期实习 通用软件开发工程师 数据存储与机器视觉 面经 机试 7.6 第一题 字符串匹配 给五行英文句子,找出来其中的网址,网址以http或https开头,以com结尾,不要重…

    技术杂谈 2023年7月23日
    069
  • form表单提交中文乱码的详细解析

    摘要:中文乱码主要是根据 get,post请求的不同,处理方式没选对引起的,当然也有小可能是tomcat的版本不同引起的 form表单提交中文乱码问题:首先 get,和 post …

    技术杂谈 2023年5月31日
    089
  • pyuic5和pyrcc的使用方法

    一、如果是使用 Qt Designer设计界面的话,那么如何将Qt Designer设计出来的界面(.ui 文件)与业务逻辑程序接合起来,如下两个方法:方法一:将.ui 文件通过命…

    技术杂谈 2023年7月11日
    091
  • gcc -g -o objdump & nm & addr2line ar & objcopy & readelf & gprof

    -O设置一共有五种:-O0、-O1、-O2、-O3和-Os。你只能在/etc/make.conf里面设置其中的一种。 除了-O0以外,每一个-O设置都会多启用几个选项,请查阅gcc…

    技术杂谈 2023年5月31日
    052
  • Kubernetes Daemonset 实操笔记

    DeemonSet DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Po…

    技术杂谈 2023年7月11日
    0119
  • Property Trees & DispalyItem

    版权声明:本文为CSDN博主「tornmy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/…

    技术杂谈 2023年5月31日
    089
  • 归并排序算法

    java代码: 1 public static void main(String[] args) { 2 int arr[] = {2,7,1,5,9,6,10}; //要排序的数…

    技术杂谈 2023年7月11日
    072
  • SpringBoot与多数据源那点事儿~

    持续原创输出,点击上方蓝字关注我 目录 前言 写这篇文章的目的 什么是多数据源? 何时用到多数据源? 整合单一的数据源 整合Mybatis 多数据源如何整合? 什么是动态数据源? …

    技术杂谈 2023年7月24日
    069
  • macbook 入门

    前面的话 第一次使用 Mac 之前,需要改变一些原有思维,不应该使用 Windows 的思维习惯去使用 Mac,Mac 会节省系统维护、清理杀毒、升级驱动等操作的时间,让我们可以专…

    技术杂谈 2023年5月30日
    074
  • Java基础——字符序列(StringBuffer和StringBuilder)

    因为String对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低。因此,JDK又在java.lang包提供了可变字符序列StringBuilde…

    技术杂谈 2023年7月24日
    070
  • 多态

    总结: 多态是一种代码现象 也是一种思想 定义:一个对象,在不同时刻表现出来的多种形态 前提: 存在继承/实现关系 子类重写父类方法/实现类重写接口方法 父类引用指向子类对象/接口…

    技术杂谈 2023年6月21日
    087
  • 学校用ipad 4通过vpn上外网方法

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月25日
    086
  • 「甄知科技」收购数智化开发平台「猪齿鱼」,将和已有产品「燕千云」融合形成产品闭环

    甄知 • 使命源自解决流程挑战 36氪获悉,专注企业业务服务和软件研发管理的「甄知科技」将完成对数智化开发平台「猪齿鱼」的收购。据了解,本次收购后,「甄知科技」将通过「燕千云」和「…

    技术杂谈 2023年7月24日
    067
  • 动态ip、静态ip、pppoe拨号的区别

    pppoe拨号 pppoe拨号上网,又叫做ADSL拨号上网、宽带拨号上网。指现在有很多我的E家用户,送的无线猫,阉割了PPPOE拨号功能,必须要从电脑上拨号才能上网。还有大街上的W…

    技术杂谈 2023年5月31日
    0106
  • 为BlueLake主题增加自定义icon图标

    一、前言 hexo 的 Bluelake 主题是我一直在用的,简单大方,很喜欢。但最近有了添加自定义 icon 图标的需求,比如,添加 “地址”、&#822…

    技术杂谈 2023年7月25日
    076
  • WIN10平板如何打开文件夹选项

    打开计算机,然后查看,最后可以找到选项 本文为博主原创文章,未经博主允许不得转载。 posted @2018-08-18 15:38 gary_tao 阅读(364 ) 评论() …

    技术杂谈 2023年5月31日
    0115
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球