zoukankan      html  css  js  c++  java
  • 关于一些无法被代替的宏定义函数

    在cocos2d有一个宏定义函数:CREATE_FUNC(func)

    该宏做能放到类中使用,作用就是生成一个 返回一个该类指针的函数。

    但因为 宏定义函数 有很多限制和危险性,所以我曾想用 继承模板类的方法代替这种宏定义函数:

    template<typename T>

    class CREATE_FUNC{

       static  T* create()

        {

             ...

        }

    };

    使用方法

    class T: public CREATE_FUNC<T>{


    };

    一开始我以为很完美,实践出真理,我发现这种写法很坑爹,因为如果当某个类继承了该模板实现类,然后它的继承类也继承该模板实现类,问题就来了

    ,这时如果我们调用继承类的create 函数时,编译器就会不知道你调用的是 基类的 create还是 继承类的create,因为这2个create分别是继承自不同的CREATE_FUNC<T>

    在不同的域所以也不会屏蔽基类的create, 如果继承类想要调用自己的create就必须 这样

    InheritClass::CREATE_FUNC<InheritClass>::create()

    相当的麻烦。

    当然有一种比较简单的办法可以代替这种宏,那就是使用模板函数

    template<typename T>

    typename *T CREATE_FUNC()

    {

          ...

    }

    在调用时必须声明 模板类型也不方便

    但我们可以在每个类中 都定义一个该函数的特化

    auto CREATE_FUNC_ =  &CREATE_FUNC<T>(); //用函数指针 指向某函数的特化(没测试,只是一种认为可行的想法)

    这样问题就解决了





  • 相关阅读:
    Quartz.Net定时器
    Lucene.Net 实现搜索功能
    哈希表 STL map
    买卖股票的最佳时机I II III IV
    [离散化]人潮最多的時段( Interval Partitioning Problem )
    动态规划[入门]3-更难的矩阵取数问题
    动态规划[入门3]-多重背包问题
    动态规划[入门]2-循环数组最大子段和
    catalan卡塔兰数
    逆波兰表达式
  • 原文地址:https://www.cnblogs.com/riskyer/p/3236890.html
Copyright © 2011-2022 走看看