gpt4 book ai didi

c++ - 如何处理这种情况(需要注册可变参数的函数)

转载 作者:行者123 更新时间:2023-11-30 03:05:14 27 4
gpt4 key购买 nike

我正在寻找有关如何处理这种情况的建议,因为到目前为止我想到的任何事情都行不通。

我正在开发一款角色扮演游戏,目前正在开发图形系统。我的图形系统由一系列按特定顺序排列然后绘制的 ScreenStack 组成。

ScreenStack 基本上只是相关屏幕的集合,以及唯一的 ID 和绘制顺序。

class ScreenStack
{
//Constructors, getters/setters etc.
private:
std::string StackName;
int DrawPriority;
int UID;

bool Valid;
bool DrawStack;
bool UpdateStack;
bool SendInputs;
bool DeleteStack;
std::vector<screen_ptr> OwnedScreens; //screen_ptr is a shared_ptr around a Screen object
};

屏幕是一个简单的图形层,负责可视化游戏的某些部分,例如,有一个屏幕用于显示玩家库存、队伍概览、战斗中的队伍状态、敌方队伍等。

我有一个屏幕管理器,负责存储创建屏幕堆栈的各种函数(即创建战斗堆栈的函数将为玩家方、敌方、攻击动画屏幕、背景制作屏幕,和用户界面)。各种屏幕堆栈创建函数中的每一个都需要一组不同的参数来构造它。我现在正在做的是根据需要手动将堆栈创建函数添加到屏幕管理器中。例如,现在屏幕管理器具有创建标题屏幕堆栈、开始菜单堆栈、战斗堆栈、世界堆栈、 map 堆栈等的功能。

这可行,但很麻烦且困惑。我想要做的是让屏幕管理器外​​部的文件能够向屏幕管理器注册堆栈创建函数,然后我可以只查找屏幕创建函数,而不必向我需要创建的每个堆栈的屏幕管理器。

我最初尝试添加一个 unordered_map<std::string, StackCreationFunction> StackCreationFunction 被定义为

boost::function<ScreenStack (Engine& engine, ScreenManager& manager, const std::string screenName, const int StackID, const std::vector<std::string>& TryToCopyScreens, ...)> 

... 来自 cstdargs。这个想法是每个 ScreenStack 都会将它自己的 StackCreationFunction 添加到这个 map 。但是这不起作用,因为 boost::function 对...无效

所以本质上我想做的是允许外部文件/屏幕能够向屏幕管理器注册他们自己的创建函数(具有可变参数),并且理想情况下能够在编译时/启动后立即执行此操作.感觉预处理器应该可以,但我不确定该怎么做。我被困在这里,我真的想要一个更好的解决方案,然后向屏幕管理器添加许多堆栈创建器函数并将其弄乱。

任何建议/更好的解决方案将不胜感激,如果以上内容不够清楚,我可以提供更多详细信息

谢谢

最佳答案

Each of the various screen stack creation functions needs a different set of paramters to construct it.

我认为这就是问题所在,您需要在这里考虑一个抽象来使您的 map 正常工作。毕竟,调用代码实际上是如何提供这些额外参数的呢?当调用代码知道实例化了哪个类并且可以提供参数时,您就不需要映射了。否则,映射就没有用,因为您无法确定向堆栈创建函数提供哪些参数。

最可能的解决方案是 boost::bind 掉 StackCreatorFunction 的所有参数,这些参数通常会进入 ... 参数,并在无序映射中注册函数的这个绑定(bind)版本,这可以从 ... 中释放出来。

关于c++ - 如何处理这种情况(需要注册可变参数的函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7902778/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com