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);