5 votes

Existe-t-il une alternative établie à cout en C++ qui se comporte de manière similaire à qDebug ?

J'aime la facilité avec laquelle il est possible d'écrire quelques variables sur la sortie console en C++ en utilisant qDebug de Qt :

int a = b = c = d = e = f = g = 1;
qDebug() << a << b << c << d << e << f << g;

Résultat :

1 1 1 1 1 1 1

En comparaison, l'utilisation de std::cout m'obligerait à ajouter l'espacement et la nouvelle ligne manuellement pour obtenir le même résultat :

std::cout << a << " " << b << " " << c << " " << d << " " << e << " " << f << " " << g << "\n";

Bien que j'utilise souvent Qt, je travaille parfois sur des projets où l'ajout du framework Qt juste pour avoir accès à qDebug serait excessif. Et bien qu'il ne soit pas difficile d'écrire une nouvelle classe qui se comporte de manière similaire à qDebug je me demande s'il existe une alternative établie à la std::cout avec un comportement similaire à celui de qDebug existe déjà ?

Edita: Ce que je recherche, c'est idéalement un établi bibliothèque (ou snippet, mais je préfère quelque chose d'existant plutôt que de créer ma propre bibliothèque) que je peux toujours utiliser comme solution de référence lorsque j'ai besoin de quelque chose comme ça. Il peut s'agir d'un en-tête uniquement, d'une grande bibliothèque de journalisation très utilisée et bien testée, ou d'un simple petit extrait. L'essentiel est qu'il soit suffisamment petit et/ou standard pour que d'autres collaborateurs soient d'accord pour l'inclure dans un projet uniquement à des fins de débogage/journalisation.

Edit 2 : Pour clarifier : Ce serait génial d'avoir une solution qui insère à la fois des espaces entre les variables et des retours à la ligne pour chaque déclaration :

myDebug << 1 << 2 << 3;
myDebug << 4 << 5 << 6;

Il devrait revenir :

1 2 3
4 5 6

7voto

Vittorio Romeo Points 2559
struct debugcout { };

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

inline debugcout debug{};

Uso:

int main()
{
    debug << 1 << 2 << 3;
}

3voto

O'Neil Points 3278
#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;
}

<a href="http://coliru.stacked-crooked.com/a/24df0dca1903450a" rel="nofollow noreferrer">Demo</a>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X