c++ - 原生 C++ 中的数据驱动设计

标签 c++ xml

所以我正在编写一个游戏引擎,利用数据驱动设计从 xml 文件中实例化各种参与者。我最近完成了事件管理系统的编码,一切都触发了事件,处理程序正确地捕获了它们。考虑到我使用了成员函数指针和模板,这不是一件容易的事。我现在遇到的问题是我希望能够在 xml 文件中执行类似的操作:

<InputComponent>
   <Event  EventName="GainedFocus" OnEvent="Initialize"/>
</InputComponent>

问题应该很明显。 C++ 没有反射形式,因此据我所知,无法从字符串“Initialize”中获取 Initialize 函数的地址。这意味着对于稍微不同的输入组件,我从类派生并注册特定于该实例的事件并添加函数。此外,应该知道这与我处理典型输入的方式不同:

<InputComponent>
   <Mapping Type="MousePress" Button=1 Command="RotateCamera"/>
</InputComponent>

在此实例中,映射是特定于输入组件的元素,而命令本身是使用工厂创建的对象。不过,我真的不能用通用事件来做到这一点。命令是对不同对象执行完全相同操作的特定项目,而对象或组件本身通常需要以不同方式处理各个事件。以前有人做过这样的事吗?真的很好奇有人如何做这样的事情,以便不需要将需要注册到对象的事件硬编码到类本身中。

编辑:让我这样说。同一类型组件的不同实例需要对事件做出不同的 react 。这将是特定于应用程序的,因此应该与引擎代码分开(我不必修改组件)。用户应该能够提供可以在对事件使用react时调用的函数。函数和事件都应该能够在 XML 中绑定(bind)。我开始认为这在非​​托管 C++ 中可能是不可能的,因为没有任何形式的元数据可以根据同名字符串查找用户提供的函数。

最佳答案

您可以使用将字符串与函数指针相关联的映射。
或者,如果函数签名不同,您可以使用带有 if-else-if 阶梯的工厂模式。

编辑 1:示例

// Typedef for event functions
typedef void (*Event_Function_Pointer)(const Event& e);

typedef std::map<std::string, Event_Function_Pointer> Event_Function_Container;

//...
Event_Function_Container events;
events["Gained Focus"] = Initialize;

由于文本和函数指针是常量数据,因此还可以选择查找表:

struct Event_Function_Entry
{
  char * const * event_name;
  Event_Function_Pointer event_function;
};

Event_Function_Entry events[] =
{
  {"Gained Focus", Initialize},
};

关于c++ - 原生 C++ 中的数据驱动设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27070835/

相关文章:

xml - Xquery 从 XSD 架构中获取属性名称和类型?

xml - 是否可以在内部使用 XML 模式,就像 DTD 一样?

asp.net - Web.config 中的斜杠

java - Element web-app 必须在 Intellij 中声明错误

c++ - 当我按值而不是按引用返回时,为什么不能调用运算符?

c++ - zlib inflate 方法没有按预期工作

c++ - fread 速度管理非托管

c++ - 重载全局 operator new(非 POD)

java - Java中如何通过抽象类访问子类?

c++ - 如何使用 C/C++ 创建回调函数