使用 C++ 宏检查变量是否存在

rcv*_*rcv 5 c++ macros metaprogramming

我正在为我的库创建一个日志记录工具,并制作了一些不错的宏,例如:

#define DEBUG  myDebuggingClass(__FILE__, __FUNCTION__, __LINE__)
#define WARING myWarningClass(__FILE__, __FUNCTION__, __LINE__)
Run Code Online (Sandbox Code Playgroud)

其中 myDebuggingClass 和 myWarningClass 都有一个重载的 << 运算符,并对日志消息做一些有用的事情。

现在,我有一些用户将重载的基类称为“Widget”,我想将这些定义更改为更类似的内容:

#define DEBUG  myDebuggingClass(__FILE__, __FUNCTION__, __LINE__, this)
#define WARNING myWarningClass(__FILE__, __FUNCTION__, __LINE__, this)
Run Code Online (Sandbox Code Playgroud)

这样当用户调用 'DEBUG << "Some Message"; ' 我可以检查“这个”参数是否动态转换到小部件,如果是,我可以用这些信息做一些有用的事情,如果没有,我可以忽略它。唯一的问题是我希望用户也能够从非成员函数(例如 main())发出 DEBUG 和 WARNING 消息。然而,给定这个简单的宏,用户只会得到一个编译错误,因为“this”不会在类成员函数之外定义。

最简单的解决方案是定义单独的 WIDGET_DEBUG、WIDGET_WARNING、PLAIN_DEBUG 和 PLAIN_WARNING 宏并向用户记录差异,但如果有办法解决这个问题,那就太酷了。有没有人看到做这种事情的任何技巧?

Rob*_*per 4

在 Widget 类中声明一个全局Widget* const widget_this = NULL;成员变量和一个受保护的成员变量,初始化为,然后执行widget_thisthis

#define DEBUG myDebuggingClass(__FILE__, __FUNCTION__, __LINE__, widget_this)

  • 我应该指出这个答案在很多方面都是邪恶的。它使用了我不喜欢的宏,我觉得令人厌恶的变量遮蔽,以及我通常避免使用的受保护的数据成员(尽管我在这里并不反对)。该解决方案是对您提出的问题最快、最直接的答案,但这并不意味着它就是您问题的答案。 (4认同)