lundi 25 mai 2015

overload << operator and pass parameters to std::cout

I would like to create a class for logging purposes which will behave like std::cout, but will automatically insert additional information to the stream.

a sample usage that I want would be something like (lets not care about object and context type for now, just assume they are std::string) :

Logger l;

l << "Event with object : " << obj << " while in context : " << context;

Then the output would be :

[timestamp] Event with object : [obj_desc] while in context : [this context][eol][flush]

I've been trying with :

template<typename T>
Logger& operator << (const T& msg){
    std::cout << timestamp() << msg << std::endl << std::flush;
    return *this;
}

but it seems that std::cout cannot resolve the typename T and fails to output a std::string for example while segfaulting.

A possible solution would be to overload this for all types, but this is rather annoying and time consuming.

Is there a better option to decorate std::cout output with more information?

Edit :

I do realize now that endl and flush will be appended to every message which kind of defeat the purpose, but I'm still interested in the general idea. I care more about the monadic syntax to append an arbitrary number of messages than the <<overload

Aucun commentaire:

Enregistrer un commentaire