C ++中cout的替代方法是否与qDebug类似?

时间:2018-03-20 10:31:02

标签: c++ qt

我喜欢使用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;

2 个答案:

答案 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