Ho creato il proprio oggetto std::cout
-like che scrive sia su std::cout
che su un file di registro.Modo corretto per dichiarare/definire oggetto cout-like personalizzato
Attualmente sto definendolo in questo modo in un file di intestazione, ma sto ricevendo avvisi di variabili inutilizzate.
file di intestazione <MyLib/Log.h>
static LOut { };
static LOut lo;
template<typename T> inline LOut& operator<<(LOut& mLOut, const T& mValue)
{
std::string str{toStr(mValue)};
std::cout << str;
getLogStream() << str;
return mLOut;
}
Usage:
#include <MyLib/Log.h>
...
lo << "hello!" << std::endl;
Dovrebbe essere lo
static
? lo
dovrebbe essere extern
?
Complimenti per aver spiegato il modo corretto di dichiarare un oggetto-cout
-like e mostrare come le principali implementazioni della libreria standard lo fanno.
Edit: da cout
-come oggetto, intendo una variabile globale che è sempre disponibile dopo inclusa l'intestazione corrispondente.
'std :: cout' è tipicamente solo un' std :: ostream' di qualche tipo, con un po 'speciale logica per garantire che sia inizializzato abbastanza presto, e mai distrutto; almeno un compilatore che conosco usa estensioni speciali per raggiungere questo obiettivo. Ma di solito non ne hai bisogno; se peggiora la situazione, puoi usare un singleton e scrivere 'log() << ...'. –