Я работаю над игрой 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;}
Как я могу избежать указания макроса на каждом экране?
Не используйте макрос для этого, используйте встроенную функцию шаблона:
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;
}
Вы можете определить шаблон класса, который параметризован в подклассе 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. Дополнительным преимуществом является то, что легче специализировать создание сцены для определенных типов, если у вас есть шаблон класса, чем если у вас есть шаблон функции. Если вам не нужно специализироваться, используйте его решение.