Estoy acostumbrado a pasar alrededor de cadena como esta en mis aplicaciones C++:C++ cadena que puede ser NULL
void foo(const std::string& input)
{
std::cout << input.size() << std::endl;
}
void bar()
{
foo("stackoverflow");
}
Ahora tengo un caso en el que quiero que la cadena sea NULL:
void baz()
{
foo("stackoverflow");
foo(NULL); // very bad with foo implementation above
}
pudiera cambiar foo
a:
void foo(const std::string* input)
{
// TODO: support NULL input
std::cout << input->size() << std::endl;
}
Pero para pasar una cadena literal o copiar un char*
a que la aplicación de foo
tengo que escribir algo como esto:
void bar()
{
string input("hi"); // annoying temporary
foo(&input);
foo(NULL); // will work as long as foo handles NULL properly
}
empecé a pensar en la herencia de std::string
y añadiendo una propiedad null
, pero no estoy seguro de que sea una buena idea. Tal vez sea mejor simplemente usar una cadena const char*
para los parámetros que pueden ser NULL, pero ¿qué ocurre si quiero guardar una copia de la cadena (o NULL) sin tener que administrar su memoria por mí mismo? (Consulte What are some of the drawbacks to using C-style strings? etc.)
¿Alguna solución inteligente?
¿Por qué quiere un NULL? ¿Es suficiente? – Tim
@Tim: Tal vez. Me ahorraría comprobar siempre esos parámetros para NULL, y usaría empty() para comprobar "sin valor". –
Reintroducir NULL es falso. ¿Por qué estás usando referencias en primer lugar si necesitas el espantoso puntero NULL? En realidad, una de las razones más importantes para usar referencias es que puede estar seguro de que NO ES NULO. – Thorsten79