Je travaille sur un simple gestionnaire de journalisation pour mes projets, ce qui me permet d'échanger facilement le backend.
Ceci est mon interface idéale:C++ désactive l'invocation chaînée sans retour à la ligne de commande
log::error << "some" << " log " << "message";
La façon dont je mis en œuvre était:
log::error#operator<<
retourne un objetSink
temporaire.Sink#operator<<
renvoie*this
et définit un constructeur de déplacement. Le message complet peut être utilisé dans le destructeurSink
qui est appelé à la fin de la chaîne d'invocation.
Contrived Mise en œuvre:
#include <iostream>
#include <string>
struct Sink {
Sink (std::string const& msg) : m_message(msg) {}
// no copying
Sink (Sink const& orig) = delete;
// move constructor
Sink (Sink && orig) : m_message(std::move(orig.m_message)) {};
// use the complete string in the destructor
~Sink() { std::cerr << m_message << std::endl;}
Sink operator<< (std::string const& msg) {
m_message.append(msg);
return std::move(*this);
}
std::string m_message;
};
struct Level {
Sink operator<< (std::string const& msg) { return Sink(msg); }
};
int main() {
Level log;
log << "this" << " is " << "a " << "test";
}
Cela fonctionne bien sauf que je besoin d'un moyen propre de désactiver la journalisation. Si je n'utilisais pas Enchaînement, ma fonction de journal pourrait utiliser une directive pré-processeur pour supprimer la fonction du contenu de
void log (std::string) {
#ifdef LOGGING_ENABLED
// log message
#endif
}
Le compilateur alors d'optimiser et de supprimer l'appel de fonction vide. Mais je ne sais pas comment je ferais ça avec l'API que j'essaye d'atteindre. Je sais que c'est possible parce que glog le fait d'une manière ou d'une autre.
L'utilisation de directives comme celle-ci va à l'encontre du but d'avoir une bonne API.
#ifdef LOGGING_ENABLED
log << "this" << " is " << "a " << "test";
#endif
Quelle est une manière propre de désactiver ces types d'appels chaînés? Toute aide est appréciée.
awesome, mais le constructeur de copie 'Sink' factice n'a pas pu être supprimé, ou il devrait y avoir un constructeur de déplacement. –