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

标签 c++ macros metaprogramming

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

#define DEBUG  myDebuggingClass(__FILE__, __FUNCTION__, __LINE__)
#define WARING myWarningClass(__FILE__, __FUNCTION__, __LINE__)

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

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

#define DEBUG  myDebuggingClass(__FILE__, __FUNCTION__, __LINE__, this)
#define WARNING myWarningClass(__FILE__, __FUNCTION__, __LINE__, this)

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

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

最佳答案

在Widget类中声明一个全局的Widget* const widget_this = NULL;和一个 protected 成员变量widget_this,初始化为this,以及做

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

关于c++ - 使用 C++ 宏检查变量是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3190275/

相关文章:

regex - 提取 Haskell 中特定类型的所有出现

c++ - 简单的反射机制

c++ - 在GDB中查找变量变化

c++ - 在没有事件 Hook 的情况下通信应用程序

c++ - Objective-C/C++ - 链接器错误/方法签名问题

c - 宏定义的未定义错误

c - 宏定义 :' #define my_macro (1 << 16) ' 和 '#define my_macro(1U << 16)' 有什么区别

c++ - typeinfo pragma 可见性错误

rust - 如何在程序宏中接受语法上无效的输入?

grails - 如何保存方法以备后用,将其 stub 一段时间?