zoukankan      html  css  js  c++  java
  • 模版函数指针,C++委托的实现-原创

    原文出处:模版函数指针,C++委托的实现-原创

    今天写引擎的时候,很想加入一些回调函数,以前一直没时间整理这块,这次一定要下决心好好整整代码,纯粹用多态,很多类非要加个帽子,类之间的关系也显的很单一,有的情况需要用到委托的回调机制,这是个很好的东西,在C#里面是原生支持的,C++里面本来函数指针是个不错的选择,可到了对象里面,成员函数指针还有那么好用吗?这原本是另C++程序员非常失望和无赖的,难道一说到成员函数指针就真的那么不好用,甚至要沦为被唾弃的命运?并非入此,别忘了,C++里面还有很强的利器,C#和Java后天才具备的特性可是C++先天就具备的哦,那就是范型,C++里面的用的是模版,而且如果把 模版和成员函数指针结合在一起,那就威力无比了,那应该叫做就是“成员模版函数指针”,C++的教科书上有这个名词吗?我查了查,好像是没有,而且网上很多资料竟然说这个不能实现之类的话,我都怀疑那些如此断言的人是否太不负责仁了,误导人啊。

    当然指想成员函数的指针,这里面的确有段C++设计的问题,C++的成员函数地址通过对象外去引用不能直接通过“&对象.方法”的方式来引用,这个在C++标准里面是没有的,很多人到这里就绝望了,可间接引用呢?而且用很优雅的方式来引用呢?

    好了,我也不绕圈子了,给出我的代码,一个简单的 “成员模版函数指针” 的实现,看看C++是如何优雅的实现委托的,真的非常非常的优雅,由于完全自己摸索出来的,真是感慨万千啊。

    #include "stdafx.h"

    #include <iostream>

    using namespace std;

    template<typename T>

    class A

    {

    private:

       typedef int (T::*delegateFun)(int);

       T * _This;

       delegateFun _deleGate;

    public:   

     //This被代理的对象, delegateFun被代理的方法

     

     A(T * This, int (T::*delegateFun)(int))

     {

           _This = This;

           _deleGate = delegateFun;

     }

        //c被代理的参数

     int execue(int c)

     {

          return (_This->*_deleGate)(c);

     }

    };

    class B

    {

    public:

     int FunA(int a) {return a + 10;}

     int FunB(int a) {return a - 10;}

     B()

     {

     }

    };

    int _tmain(int argc, _TCHAR* argv[])

    {

     B *objB = new B();

     A<B>  delegateObj1(objB, (&B::FunA));

     A<B>  delegateObj2(objB, (&B::FunB));

     cout << delegateObj1.execue(10) <<endl;

     cout << delegateObj2.execue(20) <<endl;

     return 0;

    }

     

     

     

    看完了感觉如何?以后想要设计一个callback回调函数是否明朗了许多?

    再也不需要强行搞个static约束方法,那么恶心的东西了吧

     

     

  • 相关阅读:
    Idea快捷键大全
    Minio创建访问策略
    如何把Minio设置成开机启动
    windows10怎么添加开机启动项
    Intellij IDEA中如何配置Maven环境
    MySQL 8.0.19安装和配置超详细教程
    图文详解一台电脑怎么设置两个显示器
    无法加载文件 E:PROGRAM FILESNODEJSNODE_GLOBALyarn.ps1,因为在此系统中禁止执行脚本
    通过MacOS的ssh远程打开linux的firefox(通过X11协议实现图形化显示)
    Java8 stream分组按某字段取最大值
  • 原文地址:https://www.cnblogs.com/qilinzi/p/1941781.html
Copyright © 2011-2022 走看看