Как определить универсальную шаблонную функцию создания для подкласса

Я работаю над игрой 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;}

Как я могу избежать указания макроса на каждом экране?

1

Решение

Не используйте макрос для этого, используйте встроенную функцию шаблона:

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;
}
2

Другие решения

Вы можете определить шаблон класса, который параметризован в подклассе 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;
}
};

И тогда вы используете Любопытно повторяющийся шаблон (CRTP) для Mixin требуемое поведение путем получения каждого подкласса с ранее определенным шаблоном с сам в качестве параметра (отсюда и слово «повторяющиеся»)

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

Обратите внимание, что SomeNewSubClass на самом деле подкласс cocos2d::CCScene потому что ваш Cocos2DSceneCreate сам по себе уже подкласс.

Также обратите внимание, что это решение шаблона класса немного сложнее, чем решение шаблона функции от @Yuushi. Дополнительным преимуществом является то, что легче специализировать создание сцены для определенных типов, если у вас есть шаблон класса, чем если у вас есть шаблон функции. Если вам не нужно специализироваться, используйте его решение.

1

По вопросам рекламы [email protected]