具有静态方法的类的 C++ 模板

标签 c++ templates c++11 refactoring cocos2d-x

我目前正在使用 cocos2dx 引擎编写游戏,并且我有一个关卡管理器来跟踪当前关卡和需要加载的场景。我想避免长 if 语句,例如:

Scene* scene;
if (level == 1)
{
      scene = Game_Scene1::createScene();
}
else if (level == 2)
{
      scene = Game_Scene2::createScene();
}
else if (level == 3)
{
      scene = Game_Scene3::createScene();
}
(...)
else if (level == 10)
{
      scene = Game_Scene10::createScene();
}

Director::getInstance()->replaceScene(TransitionFade::create(0.5, scene, Color3B(0,0,0)));

screateScene()方法是静态方法

static cocos2d::Scene* createScene();

我该怎么做才能“删除”if 语句?所以它看起来像这样:

Scene* scene = getScene(level, sceneClass::createScene());

它会采用正确的类(即:Game_Scene1Game_Scene2 等)

这样的问题有好的解决方案吗?标题说模板,但我不太确定这个解决方案是否是模板。

最佳答案

一个简单的解决方案是使用指针函数表。

你可以声明你的表为

typedef cocos2d::Scene *(*PtfCreateScene)();
PtfCreateScene tab[10];

tab[0] = Game_Scene1::create_scene;
tab[1] = Game_Scene2::create_scene; ... 

使用此解决方案,您可以使用 level 作为索引调用关联的 create_scene 函数。从而避免 if 分支。

scene = tab[level - 1]();

您必须检查索引的正确性以避免内存不足访问。

希望我回答了你的问题。如果您需要更多解释,请随时询问。

关于具有静态方法的类的 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35405187/

相关文章:

c++ - 从这个对象的方法开始的线程中销毁类对象的最佳实践

c++ - 我应该在使用 std::transform 之前检查 vector 是否为空

c++ - C/C++ 优化

c++ makefile - 你如何处理混合源文件后缀的规则(例如.cpp和.cxx)

java - 将 OpenCV 转换为 JavaCV - 在函数 cvHoughLines2() 中需要帮助

C++ 检查构造函数是否包含给定类型的参数

c++ - 忽略了 OpenMP 任务依赖性?

c++ - 单例 C++ 模板类

c++ - 将 std::async 与模板函数一起使用

c++ - 来自模板参数的字符串的 constexpr 长度