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

dra*_*gly 4 c++ qt

我喜欢使用qDebugQt 在C++中将一些变量写入控制台输出是多么容易:

int a = b = c = d = e = f = g = 1;
qDebug() << a << b << c << d << e << f << g;
Run Code Online (Sandbox Code Playgroud)

结果:

1 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

相比之下,使用std::cout需要我手动添加间距和换行符以获得相同的结果:

std::cout << a << " " << b << " " << c << " " << d << " " << e << " " << f << " " << g << "\n";
Run Code Online (Sandbox Code Playgroud)

虽然我经常使用Qt,但我有时会处理一些项目,在这些项目中添加Qt框架只是为了访问qDebug会有点过分.虽然编写一个行为类似的新类并不难qDebug,但我想知道是否已经存在std::cout类似行为的qDebug已建立替代方案?

编辑:我正在寻找的是理想的已建立的库(或片段,但我更喜欢现有的东西而不是我自己的东西),当我需要这样的东西时,我可以随时使用它作为我的首选解决方案.它可能只是标题,或者是一个经常使用和经过充分测试的大型日志记录库,或者是一个简单的小片段.关键是它应该足够小和/或标准,以便其他协作者可以将其包含在项目中仅用于调试/记录目的.

编辑2:澄清:有一个解决方案,在每个语句的变量和换行符之间插入空格会很棒:

myDebug << 1 << 2 << 3;
myDebug << 4 << 5 << 6;
Run Code Online (Sandbox Code Playgroud)

应该返回:

1 2 3
4 5 6
Run Code Online (Sandbox Code Playgroud)

Vit*_*meo 7

struct debugcout { };

template <typename T>
debugcout& operator<<(debugcout& os, const T& x)
{
    std::cout << x << ' ';
    return os;
}

inline debugcout debug{};
Run Code Online (Sandbox Code Playgroud)

用法:

int main()
{
    debug << 1 << 2 << 3;
}
Run Code Online (Sandbox Code Playgroud)

  • @dragly这是一个名为*inline变量的C++ 17特性*[自GCC 7起支持](http://en.cppreference.com/w/cpp/compiler_support). (3认同)

O'N*_*eil 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;
    }
};
Run Code Online (Sandbox Code Playgroud)
int main() {
    myDebug() << 1 << 2 << 3;
    myDebug() << 4 << 5 << 6;
}
Run Code Online (Sandbox Code Playgroud)

Demo