Actualmente utilizo la siguiente plantilla simplemente como una forma de verificar el puntero NULL y si es NULO, entonces imprimo un mensaje de error en un archivo de registro y luego devuelvo falso.Pasar la variable "nombre" en 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;
}
Actualmente Yo llamo a esto de la siguiente manera:
if(!(isnull(dim, BOOST_STRINGIZE(dim)))) return false;
Si nota que necesito para pasar en el "nombre" del puntero variable que quiero imprimir el archivo de registro, como el 2º parámetro. Actualmente estoy usando BOOST_STRINGIZE que simplemente convierte cualquier texto entre paréntesis en una cadena.
Las siguientes son las desventajas de mi implementación de plantilla (para mi uso al menos)
- Cualquiera podía pasar nada como parámetro para BOOST_STRINGIZE para imprimir en el archivo de registro - desde los 2 parámetros no están relacionados de de todos modos, entonces no necesariamente vería el "nombre de variable" que en realidad es NULL
- Tenemos que recordar pasar el segundo parámetro, sino inútil.
¿De todos modos puedo tener el "nombre" de esa primera variable que se determina automáticamente, de modo que puedo omitir pasarlo, como el 2º parámetro, con cada llamada?
A menos que hagas magia de preprocesador, no es posible. pero siempre se puede escribir: 'is_null #define (a) isnull ((a), #A)' – lollinus
El segundo problema puede ser resuelto con sólo deshacerse del defecto en el parámetro de nombre. Solo relacionado tangencialmente, usando "name.empty()" podría ser más rápido y/o más claro que "! Name.length()" –
@ Mark-B. Gracias por el comentario "vacío" :). Creo que simplemente asumí que dado que vector.empty() en realidad llama a size() (en la implementación de VC++ 2005) que probablemente sea el mismo para las cadenas. Bad ossandcad. – ossandcad