如何为子类定义通用模板化创建函数

时间:2013-04-18 07:23:27

标签: c++ templates subclass mixins crtp

我正在研究cocos2dx游戏,我需要为每个子类/场景定义一些东西(宏),如CREATECOCOS2DSCENE(CustomSceneNameScreen);`具有以下定义

 #define CREATECOCOS2DSCENE(T)\
 \
 static cocos2d::CCScene  * scene()\
 {cocos2d::CCScene * scene = new cocos2d::CCScene; scene->init(); T * layer =  new T;       layer->init();scene->addChild(layer); layer->release(); scene->autorelease(); return scene;}

如何避免在每个屏幕上指定宏?

2 个答案:

答案 0 :(得分:2)

不要使用宏,使用内联模板函数:

template <typename T>
inline static cocos2d::CCScene* scene()
{
    cocos2d::CCScene* scene = new cocos2d::CCScene; 
    scene->init(); 
    T * layer =  new T;       
    layer->init();
    scene->addChild(layer); 
    layer->release(); 
    scene->autorelease(); 
    return scene;
}

答案 1 :(得分:1)

您可以定义一个类子模板,该子模板在您最终要使用的子类T上进行参数化,并且包含一个公共静态函数create(),它完全符合您当前定义的宏

template<typename T>
struct Cocos2DSceneCreate
:
    // each subclass of Cocos2DSceneCreate is automatically a subclass of cocos2d::CCScene
    public cocos2d::CCScene
{
    // exact same content as your macro
    static cocos2d::CCScene* scene() 
    {
        cocos2d::CCScene * scene = new cocos2d::CCScene; 
        scene->init(); 
        T * layer =  new T;       
        layer->init();
        scene->addChild(layer); 
        layer->release(); 
        scene->autorelease(); 
        return scene;
    }
};

然后使用 Curiously Recurring Template Pattern (CRTP) mixin 所需行为,方法是使用先前定义的模板本身<派生每个子类/ strong>作为参数(这是“重复出现”一词的来源)

class SomeNewSubClass
:
    public Cocos2DSceneCreate<SomeNewSubClass>
{
    // other stuff
};

请注意,SomeNewSubClass实际上是cocos2d::CCScene的子类,因为您的Cocos2DSceneCreate本身已经是子类。

另请注意,此类模板解决方案比@Yuushi的功能模板解决方案复杂一些。另外一个优点是,如果您拥有类模板,则比使用功能模板更容易专门为特定类型创建场景。如果您不需要专业化,请使用他的解决方案。