• 关于一些无法被代替的宏定义函数


    在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>(); //用函数指针 指向某函数的特化(没测试,只是一种认为可行的想法)

    这样问题就解决了





  • 相关阅读:
    HDU1720 A+B Coming
    HDU1390 ZOJ1383 Binary Numbers
    HDU1390 ZOJ1383 Binary Numbers
    HDU2504 又见GCD
    HDU2504 又见GCD
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1020 ZOJ2478 Encoding
    HDU1020 ZOJ2478 Encoding
    HDU2097 Sky数
  • 原文地址:https://www.cnblogs.com/riskyer/p/3236890.html
Copyright © 2020-2023  润新知