禁用没有宏的C++代码

War*_*ine 2 c++ macros aop

我讨厌宏.我试图避免尽可能多地使用它们,但我偶尔需要它们来启用/禁用我的代码中的功能.典型:

#ifdef THREAD_SAFE
  typedef boost::mutex Mutex;
  typedef boost::mutex::scoped_lock ScopedLock;
#else
  typedef struct M {            } Mutex;
  typedef struct S { S(M m) { } } ScopedLock;
#endif
Run Code Online (Sandbox Code Playgroud)

这样我可以保持我的实际代码不变.我相信编译器在未定义宏时删除安慰剂代码.

我知道模板专业化可能是一个解决方案,但这将涉及大量重写/代码重复.

没有必要成为C++专家来猜测我在编译器上作弊的方式有问题.我正在寻找更好的解决方案.

Xeo*_*Xeo 6

您使用的不是宏,而是正常的预处理器功能.此外,您不是依赖于编译器,而是依赖于预处理器.
编译器只会看到两个版本中的一个,另一个在编译步骤之前被删除.使用预处理器执行(条件)包含/排除代码没有错.它不是任何"作弊",这完全是预处理器的用途.