2 votes

Journalisation différée C++ (sans C++11)

Actuellement, notre base de code comporte beaucoup de code qui ressemble à ce qui suit :

void log(int level, const char *msg) {
    // logLevel is some global int defining which messages to log
    if (level <= logLevel) {
        cout << msg << endl;
    }
}

...

int someNum = 3;
if (1 <= logLevel) {
    char msg[200];
    sprintf(msg, "Some format %d", someNum);
    log(1, msg);
}

Nous utilisons Visual Studio 2008, et ne pouvons donc pas utiliser les fonctionnalités de C++11. Existe-t-il un moyen propre de passer une fermeture à la méthode de journalisation, afin de pouvoir supprimer la condition "if" en double ? Par exemple, je cherche un code équivalent à ce qui suit dans la syntaxe pré-C++11 :

void log(int level, std::function<std::string ()> getMessage) {
    if (level <= logLevel) {
        cout << getMessage() << endl;
    }
}

...

int someNum = 3;
log(1, [someNum]() -> std::string {
    std::ostringstream sstream;
    sstream << "Some format " << someNum;
    return sstream.str();
});

Le mieux que j'ai pu trouver est :

struct LogMessage {
    virtual std::string operator()() const = 0;
};

void log(int level, const LogMessage &getMessage) {
    if (level <= logLevel) {
        cout << getMessage() << endl;
    }
}

...

struct X : public LogMessage {
    X(int num) : myNum(num) { }
    std::string operator()() const {
        std::ostringstream out;
        out << "Some format " << myNum;
        return out.str();
    }
    private: const int myNum;
} a(someNum);
log(1, 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