如何保留变量参数函数的注册表

时间:2011-10-20 20:42:35

标签: c++ boost-function

我会解释我正在尝试做什么:

我正在开发一款游戏。为了处理图形,我有一堆ScreenLayers,我更新和绘制。 ScreenLayer负责为游戏的某些方面提供可视化(库存,聚会概述,wolrd地图,瓷砖地图等)。

为了处理屏幕转换,我想为各种屏幕类型创建一个函数注册表,然后屏幕将调用此注册表来从绘图堆栈中推送和弹出屏幕图层。 (即,在瓷砖地图上,如果你按下开始,瓷砖地图将调用注册表并告诉它创建根开始菜单屏幕。开始菜单将被推到瓷砖地图的上方并将控制输入直到开始菜单关闭,此时它会自动弹出堆栈并将控制权交还给调用它的层。

问题是每个屏幕层都需要一组不同的参数来构建它

CharacterOverviewScreen(boost::shared_ptr<Engine>& engine, const std::string& rmlDoc, Game::Character::Party* party);

VS

MapViewLayer(boost::shared_ptr<Engine>& engine, const std::string &mapFile, const sf::Vector2f &startPos, const std::string &name, int layerID, bool draw, Game::Character::Party* party);

理想情况下,我希望每个屏幕能够注册一个包含我的屏幕保护程序的小功能,并使其成为一个合适的ScreenStack

ScreenStack CharacterOverviewStackCreator(boost::shared_ptr<Engine>& engine, const std::string& stackName const std::string& rmlDoc, Game::Character::Party* party)
{
    return ScreenStack(stackName, engine->GetUID(), boost:shared_ptr<ScreenLayer>(new CharacterOverviewScreen(engine, rmlDoc, party)));
}

我需要一种方法来注册接受可变参数的ScreenStack创建函数,并且如果可能的话,允许每个ScreenLayer派生类自己注册这个堆栈创建函数。

我最初的想法是尝试这样的事情:

typedef boost::function<ScreenStack (boost::shared_ptr<Engine>& engine, const std::string stackName, ...)> ScreenCreationFunction;

class ScreenManager : public AnimatedDraw
{
public:
    ScreenManager(boost::shared_ptr<Engine>& engine);
    bool RegisterScreenMakerFunction(const ScreenCreationFunction& creatorFunction, bool overwriteExisting = false);
    ScreenCreationFunction& GetScreenMakerFunction(const std::string& makerName);

    ScreenStack MakeStack(const std::string& makerFunction, const std::string, const std::vector<std::string>& TryToCopyStacks, ...);

protected:
private:
    boost::shared_ptr<Engine> engine;
    boost::unordered_map<std::string, ScreenCreationFunction> ScreenMakerFunctions;
};

但是,boost :: function不能与<cstdarg>中的“...”一起使用。另外,在我尝试实例化之前,我无法看到预先注册屏幕。

我考虑在boost :: function上切换到一些通用的void函数指针,但如果我可以避免这样做,我想。我认为使用预处理器进行堆栈注册是可能的,但我没有很多预处理器的经验,所以我不知道如何做到这一点。

我正在考虑使用工厂来创建屏幕堆栈,但我必须不断更新工厂功能,因为我添加了越来越多的屏幕层类型和各种参数,所以这似乎不是一个非常好的解决方案。

如果有人可以帮助我,我们将不胜感激。如果我不清楚某事,请告诉我

0 个答案:

没有答案