向函数提供参数时使用"<<"运算符

Using the '<<' operator when supplying argument to functions

本文关键字:lt 运算符 函数 参数      更新时间:2023-10-16

我一直在编写用c++编写的ns3网络模拟器。根据系统的配置方式,有一组函数用于有条件地记录输出。(即记录消息的语句总是在那里,但如果我关闭调试,那么一些消息就不会出现)。

调用其中一个函数可能如下所示:

int n=42;  
NS_LOG_LOGIC("the answer is " << n);

这非常有用,因为它允许我将许多不同类型的数据直接连接到一个要记录的字符串中。

现在,我正在尝试编写自己的日志记录函数,以便更好地控制消息的日志记录位置,并允许我在每条消息之前插入一个唯一的id和时间戳,这样我就可以知道消息何时何地来。

我的问题是,如何在c++中创建一个可以用这种方式调用的函数?我找不到所示函数的来源,也没有看到任何其他类似函数的例子。

请注意,常规的"+"连接还不够好,因为我希望能够轻松地连接一堆不同的数据类型。我知道还有其他方法可以做到这一点,但我也想弄清楚上面函数中发生了什么!

谢谢:)

这里有一种方法。如果定义了DEBUG,它将把表达式打印到标准输出。它假定CCD_ 2。

#ifdef DEBUG
#  define NS_LOG_LOGIC( expr ) 
      std::cout << expr << std::endl;  // or "n" instead of endl if performance matters more than reliability
#else
#  define NS_LOG_LOGIC( expr )
#endif

编辑

正如Tony正确指出的:

  • std::endl将打印一个新行刷新缓冲区,速度会较慢,但您可以得到更多的保证,以防崩溃时日志已经写入。n只是打印一条新行,缓冲区不会被刷新
  • 使用do { ... } while(false)表示法有助于提高宏的可靠性

一个简单的字符串生成器类在这类串联场景中可能会很有帮助,即使在更常见的情况下,您需要将最终字符串作为参数或其他东西传递(即,不仅仅记录它)。

有关示例实现,请参见例如:https://stackoverflow.com/a/5770312/19254