Attualmente utilizzo il seguente modello semplicemente come un modo per verificare il puntatore NULL e se NULL stampa un messaggio di errore in un file di registro e quindi restituisce false.Passare il "nome" della variabile in C++
template< typename T >
static bool isnull(T * t, std::string name = "")
{
_ASSERTE(t != 0);
if(!t)
{
if(!(name.length())) name = "pointer";
PANTHEIOS_TRACE_ERROR(name + " is NULL");
return false;
}
return true;
}
Attualmente chiamo questo come segue:
if(!(isnull(dim, BOOST_STRINGIZE(dim)))) return false;
Se notate ho bisogno di passare nel campo "Nome" del puntatore variabile che voglio stampare il file di log, come il 2 ° parametro. Attualmente sto usando BOOST_STRINGIZE che converte semplicemente qualsiasi testo all'interno delle parentesi in una stringa.
Di seguito sono riportati gli svantaggi della mia implementazione template (per il mio utilizzo almeno)
- Chiunque potrebbe passare nel nulla come parametro per BOOST_STRINGIZE stampare nel file di log - in quanto i 2 parametri non siano legati da comunque - quindi non vedrei necessariamente il "nome variabile" che è in realtà NULL
- Dobbiamo ricordare di passare nel 2 ° parametro, altrimenti inutile.
Esiste comunque la possibilità di determinare automaticamente il "nome" di quella 1a variabile, in modo che possa ometterlo, come secondo parametro, ad ogni chiamata?
A meno che non si esegua la magia del preprocessore non è possibile. ma è sempre possibile scrivere: '#define IS_NULL (a) isnull ((a), #a)' – lollinus
Il secondo problema può essere risolto eliminando l'impostazione predefinita sul parametro name. Solo tangenzialmente correlati, usando "nome.empty()" potrebbe essere più veloce e/o più chiaro di "! Name.length()" –
@ Mark-B. Grazie per il commento "vuoto" :). Penso che ho appena assunto che dal momento che vector.empty() chiama effettivamente size() (nell'implementazione VC++ 2005) che probabilmente era lo stesso per le stringhe. Cattivo ossacadico – ossandcad