【问题标题】:Overloading Pre-processor macros for {zero, one} arguments为 {zero, one} 参数重载预处理器宏
【发布时间】:2014-08-31 15:47:08
【问题描述】:

我正在用 C++ 为我的应用程序创建一个记录器类。此类具有将调试输出记录到文件的静态成员。我想创建一个可以以两种方式使用的宏:

LOG("Log some text")
          which calls Logger::log(std::string)

-----或-----

LOG << "Log some text" << std::endl;
          which calls Logger::getLogStream()

目标是包含 Logger.h 足以记录到文件,并且使用相同的语法完成,但如果您有其他建议,我并不特别喜欢宏。不幸的是,使用 Boost::PP 不是一种选择。

我有 looked around (see this comment),但没有发现任何关于区分对 LOG 和 LOG() 的调用。如何区分一个论点和没有论点?

【问题讨论】:

  • 你不能。预处理器可能是编译器的一部分,但它并不遵循 C 或 C++ 语言的规则,它是一种完全不同的语言,具有不同的语法和不同的语义规则。
  • 是的,我已经想到了,因为我搜索并没有找到任何方法。还有其他建议来实现这一点吗? Typedef、内联、宏或我可能错过的东西?
  • 你可以定义一个类似函数的宏LOG(X)和一个名为LOG的对象。不带括号的LOG 形式不受类函数宏扩展的影响。也可以定义一个同时重载operator()operator&lt;&lt;的函数对象。

标签: c++ macros c-preprocessor


【解决方案1】:

您可以重载 Logger 类的运算符并避免使用宏

class Logger
{
  public:

    void operator( )( const std::string& ar_text )
    {
      log( ar_text );
    }

    Logger& operator<<( const std::string& ar_text )
    {
      // use logStream here
      return *this;
    }

    Logger& operator<<(std::ostream& (*f)(std::ostream&)) // This is necessary for grabbing std::endl;
    {
      // use logStream here
      return *this;
    }
};

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多