在 C++ 中注册实现的方法

Register implemented methods in c++

本文关键字:方法 实现 注册 C++      更新时间:2023-10-16

我正在用C++编写一个游戏引擎。现在我有一个名为 GameListener 的类,它有一些游戏状态回调方法(如 update()start()awake())。因此,GameObject应该实现其中任何一个实际上是一个GameObject。这很像Unity3D。

然而,问题是,无论GameObject是否实现了某个方法,它都是由引擎调用的。所以我最终可能会得到一堆基本上什么都不做的空白方法。我怎样才能避免这种情况?以某种方式注册所有已实现的方法并调用它们。在我的游戏循环中,我有这样的东西(伪代码):

for all gamelisteners do:
gamelistener.awake();
gamelistener.update();
gamelistener.another_some_callback_method();
...

如果我有一些少量的游戏侦听器和回调方法,这不是问题。但是,如果我在 GameListener 界面中有 200 个游戏侦听器和 10 个回调方法呢?并非所有游戏侦听器都实现了这 10 个回调方法,因此,我最终得到了一堆空白方法,这些方法在游戏循环中调用。

我听说在 C# 中,这可以通过反射以某种方式解决(查看实际实现了哪些方法,并仅调用它们)。如何在 c++ 中解决此问题?

我有一个实现是我有函数指针的结构,"实现者"(在你的例子中是游戏对象)应该实现并将这些函数指针注册到主框架(游戏引擎)。

因此,如果实现者为特定回调注册了 nullptr,则框架应跳过向该实现者暗示此事件。

另一方面,如果您有需要实现的强制回调,则游戏引擎不应允许向其注册游戏对象,除非它实现了这些回调。

using callback_defn1 = std::function<void()>;
using callback_defn2 = std::function<void(int)>;
struct gameengine_callbacks {
   callback_defn1 mandatory_callback1;
   callback_defn1 mandatory_callback2;
   callback_defn2 optional_callback1;
};

在游戏引擎上类似

void GameEngine::register_objects(gameengine_callbacks callbacks)
{
   if (callbacks.mandatory_callback1 == nullptr or  callbacks.mandatory_callback1 == nullptr)
   {
         throw std::invalid_argument("some msg");
   }
   // Proceed with your registration.
}