C++ C++;无论是否在静态方法中,如何有条件地调用全局函数?
在这个问题之前,我会说,我愿意接受合理的选择,这就是我们目前所处的困境 我们希望在游戏引擎中有一个Assert()宏,如果从GameObject方法中调用,它能够自动记录基本游戏对象的元数据。这样问的动机是,我们目前有两个assert变量:assert()和AssertInStatic(),但我们只希望有一个 代码问题(注意:不是精确的代码,但概述了问题):C++ C++;无论是否在静态方法中,如何有条件地调用全局函数?,c++,C++,在这个问题之前,我会说,我愿意接受合理的选择,这就是我们目前所处的困境 我们希望在游戏引擎中有一个Assert()宏,如果从GameObject方法中调用,它能够自动记录基本游戏对象的元数据。这样问的动机是,我们目前有两个assert变量:assert()和AssertInStatic(),但我们只希望有一个 代码问题(注意:不是精确的代码,但概述了问题): 不美观,但可以将静态成员函数放在缺少 DoAssert < /代码>成员的基类中。 可以考虑使用变量宏来重载具有可选参数的宏名称。因此,参
不美观,但可以将静态成员函数放在缺少<代码> DoAssert < /代码>成员的基类中。
可以考虑使用变量宏来重载具有可选参数的宏名称。因此,参数的数量将区分全局断言和对象断言。它可以是一个伪参数或对象的特定对象参见/P>范围操作符是标准C++,并为您所希望的工作方式提供了良好的文档。OP没有创建这些:有趣的想法!不幸的是,引擎中有许多基本游戏对象的子类,它们可能有静态方法,也可能没有静态方法。我考虑过要求用户传入“this”指针以记录对象元数据,这样可以解决这个问题。最终的目标是避免用户/编码人员必须做任何明确的事情,而这只会起作用。
// macro
#define Assert(expr, msg) \
if (!(expr)) DoAssert(msg, __FILE__, __LINE__)
#define AssertInStatic(expr, msg) \
if (!(expr)) ::DoAssert(msg, __FILE__, __LINE__)
// global function
bool DoAssert(msg, file, line);
class GameObject {
protected:
// game object assert method
bool DoAssert(msg, file, line); // logs extra object metadata
};
// any global function or non-GameObject method
void foo()
{
Assert(condition, "msg"); // calls global assert function
}
// regular GameObject method
void GameObject::foo()
{
Assert(condition, "msg"); // calls GameObject assert method
}
// STATIC GameObject method
/*static*/ void GameObject::static_foo()
{
//Assert(condition, "msg"); // <ERROR: class assert method uncallable, hides global function>
AssertInStatic(condition, "msg"); // works, calls global assert, but would rather not have this special case
}
// msvc:
__if_exists(this) {
DoAssert(...);
}
__if_not_exists(this) {
::DoAssert(...);
}