向函数提供参数时使用"<<"运算符
Using the '<<' operator when supplying argument to functions
我一直在编写用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
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何显式调用运算符<<
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 过载输出<<用于类的运算符,以打印其中的元组
- C++ostream:没有运算符匹配<<&应在'&'代币
- 重载运算符<<:此运算符函数的参数太多
- C++继承运算符<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 如何过载<<用于YAML::Emitter的运算符,以序列化包含另一个自定义类的向量的自定义类
- 为什么字符串流运算符<<擦除原始值
- 关于使用运算符<<为新手提供C++中的模板
- 我已经完成了<<运算符重载,但它'It’不起作用
- 重载运算符<<输出地址而不是数据成员
- 错误:没有匹配'运算符<<"在'std::cout
- 重载运算符<<用于ostream语法
- 当运算符<存在时,为什么要定义 LT?
- log4cxx访问异常,使用<<运算符和宏
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多