如何调用包含 header 的函数?

How to call a function on header inclusion?

我正在开发一个用于制作 2D 游戏的简单框架。它使用的组件和系统因游戏而异。

为了让引擎的其他部分更容易遍历所有可能的系统和/或组件,我希望它们在包含其中一个时让自己为人所知(每个都有自己的 header 文件),以创建所有可能的组件类型和系统类型的列表的方式。

我目前通过将 Register 结构放在系统或组件定义之后的底部来解决这个问题,并将该组件/系统指针作为参数传递给 Register 结构的构造函数,即:

std::vector<Component*> Components    
struct Register{
    Register(Component* newComponent){
        Components.push_back(newComponent);
    }
}

然后在每个组件的底部使用 header:

 Register 2DPosReg(&2DPos);

这确保在我们进入主代码之前,所有组件都列在组件中。以同样的方式,我还将这些组件的名称和一些其他细节添加到一些全局向量中。 但是,创建一个永远不会只用于在其构造函数中执行代码的临时 object 似乎不必要地混乱。

是否有任何其他方法可以将 header 包含在其余代码中 'known'?

我想避免我以前的解决方案,我有一个很长的 Register(&2DPos, &Vel, &Acc, ...etc) 函数来注册所有选项,因为对所用组件的任何更改都需要 re-editing这个函数。

(另外,第一个Whosebug问题,如果太长/有初学者错误,请见谅)

However, it seems unnecesarily messy to create a temporary object that never gets used just to execute code in it's constructor.

您对解决方案的美学品质的评估是正确的。不幸的是,C++ 没有更好的机制来完成你所追求的。

毕竟,即使 C++ 标准库在 header 包含后想要检测代码执行时也必须 employ this technique

不过,由于您确实标记了此 C++17,并且您打算将 object 声明放在 header 中,因此您需要将其设为内联变量:

inline Register whatevs(...);

它应该生成一个 object per-header 文件。