L'applicazione dispone di un sistema di registrazione che consente di abilitare o disabilitare le funzionalità di registrazione dei suoi moduli in fase di runtime. I comandi di registro accettano flussi in ingresso (essendo un'alternativa sicura a "sprintf", non c'è quasi nessuna situazione più fastidiosa di quella se il tuo sistema di debug è la causa di crashCortocircuito di un flusso
Il problema è che se eseguo cose come:
logger.Trace << "Requests pending:" << buffer.findRequests();
e findRequests()
è di elevata complessità computazionale, anche se la disattivazione livello di log di traccia per il modulo, la ricerca verrà effettuata (durante il montaggio del flusso) prima che venga respinto all'interno del metodo Trace operator<<
.
l'ovvio alternativa sarebbe quella di sparpagliare il codice con:
if(logger.Trace.Enabled()) logger.Trace << ...
Non è bello e non è comodo. Poterla sostituire con una macro utilizzando if
, o uno che utilizza &&
corto circuito, essendo leggermente migliore (può essere utilizzato come rvalue, che segue ritorna filosofia stream bool false disabili stream):
#define TRACE if(logger.Trace.Enabled()) logger.Trace
#define TRACE dummyLogVar = logger.Trace.Enabled() && logger.Trace
Né è particolarmente carino o sicuro. Un collega ha suggerito chiusure:
logger.Trace([&](f){f << "Requests pending:" << buffer.findRequests();});
Il .Trace
valuterebbe la chiusura solo se tale livello è abilitato. Logicamente, è bello, ma sintatticamente assolutamente orribile. Digitando quel pasticcio: logger.Trace([&](f){f <<
... ;});
centinaia di volte?
Esiste un modo più accurato, sicuro e confortevole per impedire la valutazione di un flusso?
Penso che le chiusure siano l'unico modo. Ho dovuto risolvere questo stesso problema prima dell'introduzione delle chiusure, e mi sono ritrovato a ricorrere ai macro e alle chiamate di funzione in stile C. –
_ "Logicamente, è bello, ma sintatticamente assolutamente orribile." _ Hehe benvenuto in C++ –
@LightnessRacesinOrbit: sii felice di non aver usato '<:&:>' per la chiusura. Inciampetto su quello ieri, mi ha lasciato perplesso per un bel po '. In realtà '<:' è un digrafo per '['. Chi al giorno d'oggi usa ancora digrammi e perché? E perché nel mondo C++ 11 ha esteso il set di digraphs e trigraphs ?! Qualcuno ha frainteso la "programmazione integrata" e utilizza il telefono Android con tastiera touchscreen per scrivere applicazioni per PC? –