Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;无论是否在静态方法中,如何有条件地调用全局函数?_C++ - Fatal编程技术网

C++ C++;无论是否在静态方法中,如何有条件地调用全局函数?

C++ C++;无论是否在静态方法中,如何有条件地调用全局函数?,c++,C++,在这个问题之前,我会说,我愿意接受合理的选择,这就是我们目前所处的困境 我们希望在游戏引擎中有一个Assert()宏,如果从GameObject方法中调用,它能够自动记录基本游戏对象的元数据。这样问的动机是,我们目前有两个assert变量:assert()和AssertInStatic(),但我们只希望有一个 代码问题(注意:不是精确的代码,但概述了问题): 不美观,但可以将静态成员函数放在缺少 DoAssert < /代码>成员的基类中。 可以考虑使用变量宏来重载具有可选参数的宏名称。因此,参

在这个问题之前,我会说,我愿意接受合理的选择,这就是我们目前所处的困境

我们希望在游戏引擎中有一个Assert()宏,如果从GameObject方法中调用,它能够自动记录基本游戏对象的元数据。这样问的动机是,我们目前有两个assert变量:assert()和AssertInStatic(),但我们只希望有一个

代码问题(注意:不是精确的代码,但概述了问题):


不美观,但可以将静态成员函数放在缺少<代码> 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(...);
}