如何在 C++ 中绕过 << 调用,就好像“#ifndef DEBUG”宏一样?

How to bypass a << calling as if "#ifndef DEBUG" macro in c++?

我自己编写了一个日志库,它接受两种形式的调用。

一个喜欢正常的函数调用,另一个喜欢 std::ostream << 运算符输出。 然后我为每个日志级别分别定义了几个宏如下:

#ifdef DEBUG
#define LOG_DEBUG( strLogBody )  appendLog( leon_log::LogLevel_e::ellDebug,  std::string( __func__ ) + "()," + ( strLogBody ) )
#define LOG_INFOR( strLogBody ) appendLog( leon_log::LogLevel_e::ellInfor,  std::string( __func__ ) + "()," + ( strLogBody ) )
#define log_debug ( Logger_t( LogLevel_e::ellDebug ) << __func__ << "()," )
#define log_infor ( Logger_t( LogLevel_e::ellInfor ) << __func__ << "()," )
//...more for other log-levels

#else

#define LOG_DEBUG( strLogBody )
#define LOG_INFOR( strLogBody ) appendLog( leon_log::LogLevel_e::ellInfor, ( strLogBody ) )
#define log_debug ( Logger_t( LogLevel_e::ellDebug ) )
#define log_infor ( Logger_t( LogLevel_e::ellInfor ) )
//...more for other log-levels
#endif

当在客户端代码 space 中定义了一个 "DEBUG" 宏时,两种形式的产品 objective 代码都用于调试目的。 当没有定义 "DEBUG" 宏时,前一种形式(如函数调用)不会生成任何二进制代码来加速我的应用程序(如我所愿),而后者无论如何都会生成代码。

有没有办法,我可以绕过那些“<<”调用,就像绕过那些普通函数调用一样?

到目前为止,我使用的解决方案类似于@Botje 给出的解决方案。不同之处在于 mines 是 Logger_t 的 friend-func,而 Botje's 是 member-func。 以下是我的:

template <typename T>
inline Logger_t& operator<<( Logger_t& lgr, const T& body ) {
   if ( lgr.m_LogLevel >= g_ellLogLevel )
      dynamic_cast<std::ostringstream&>( lgr ) << body;

   return lgr;
};

但我猜想 GCC 仍然会生成调用二进制代码的函数,即使这些都是 "no-op" 调用。我不知道如何dis-assemble我的目标程序,所以我无法确认。

谢谢!请原谅我丑陋的英语!

为什么不让 operator<< 在非调试构建中成为空操作:

#ifndef DEBUG
struct Logger_t {
  template <class T>
  Logger_t& operator <<(const T& o) { return *this; }
};
#endif

编译器应该能够将整个 log_debug << ... << ... 链减少为零。

如果您还想避免 << 链中的函数调用,请为 Logger_t

定义 operator bool
#define log_debug false && Logger_t{}