我喜欢使用Qt中的qDebug
将一些变量写入C ++中的控制台输出是多么容易:
int a = b = c = d = e = f = g = 1;
qDebug() << a << b << c << d << e << f << g;
结果:
1 1 1 1 1 1 1
相比之下,使用std::cout
会要求我手动添加间距和换行符以获得相同的结果:
std::cout << a << " " << b << " " << c << " " << d << " " << e << " " << f << " " << g << "\n";
虽然我经常使用Qt,但我有时会处理这样的项目,即添加Qt框架只是为了访问qDebug会有点过分。虽然编写一个与qDebug
类似的新类并不难,但我想知道std::cout
与[{1}}具有相似行为的已建立的替代方案是否已存在?
编辑:我正在寻找的是理想情况下已建立的库(或片段,但我更喜欢滚动我自己的东西),我总是可以用作我的当我需要这样的东西时,我会找到解决方案。它可能只是标题,或者是一个经常使用和经过充分测试的大型日志记录库,或者是一个简单的小片段。关键是它应该足够小和/或标准,以便其他协作者可以将其包含在项目中,仅用于调试/记录目的。
编辑2 :澄清:如果有一个解决方案可以在每个语句的变量和换行符之间插入空格,那就太棒了:
qDebug
应该返回:
myDebug << 1 << 2 << 3;
myDebug << 4 << 5 << 6;
答案 0 :(得分:6)
struct debugcout { };
template <typename T>
debugcout& operator<<(debugcout& os, const T& x)
{
std::cout << x << ' ';
return os;
}
inline debugcout debug{};
用法:
int main()
{
debug << 1 << 2 << 3;
}
答案 1 :(得分:3)
#include <iostream>
class myDebug {
bool is_first{true};
bool is_last{true};
public:
myDebug() = default;
myDebug(myDebug const &) = delete;
myDebug & operator = (myDebug const &) = delete;
myDebug & operator = (myDebug &&) = delete;
myDebug(myDebug && dc) noexcept
: is_first{false} {
dc.is_last = false;
}
~myDebug() {
if (is_last)
std::cout << '\n';
}
template <typename T>
friend myDebug operator<<(myDebug db, const T& x) {
if (db.is_first)
db.is_first = false;
else
std::cout << ' ';
std::cout << x;
return db;
}
};
int main() {
myDebug() << 1 << 2 << 3;
myDebug() << 4 << 5 << 6;
}
<强> Demo 强>