我正在研究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;}
如何避免在每个屏幕上指定宏?
答案 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()
,它完全符合您当前定义的宏1} p>
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的功能模板解决方案复杂一些。另外一个优点是,如果您拥有类模板,则比使用功能模板更容易专门为特定类型创建场景。如果您不需要专业化,请使用他的解决方案。