Esta es probablemente una cuestión filosófica, pero me encontré con el siguiente problema:¿Por qué las instancias std :: function tienen un constructor predeterminado?
Si se define un std :: función, y no inicializa correctamente, la aplicación va a chocar, como esto:
typedef std::function<void(void)> MyFunctionType;
MyFunctionType myFunction;
myFunction();
Si la función se pasa como argumento, como esto:
void DoSomething (MyFunctionType myFunction)
{
myFunction();
}
Luego, por supuesto, también se bloquea. Esto quiere decir que me veo obligado a añadir el código de comprobación de la siguiente manera:
void DoSomething (MyFunctionType myFunction)
{
if (!myFunction) return;
myFunction();
}
que requieren estas comprobaciones me da un flash-back a los viejos tiempos C, en las que también tuvo que comprobar todos los argumentos de puntero de forma explícita:
void DoSomething (Car *car, Person *person)
{
if (!car) return; // In real applications, this would be an assert of course
if (!person) return; // In real applications, this would be an assert of course
...
}
Afortunadamente, podemos utilizar referencias en C++, lo que me impide escribir estas comprobaciones (suponiendo que la persona que llama no pasó el contenido de un nullptr a la función:
void DoSomething (Car &car, Person &person)
{
// I can assume that car and person are valid
}
Así, WH y do std :: function instances tiene un constructor predeterminado? Sin el constructor predeterminado, no tendría que agregar comprobaciones, al igual que para otros argumentos normales de una función. Y en los casos 'raros' en los que desea pasar una función 'opcional' std ::, aún puede pasarle un puntero (o usar boost :: opcional).
No se cuelga; arroja una excepción. –
Lea acerca de 'functors': http://www.sgi.com/tech/stl/functors.html –
" Me veo obligado a agregar un código de comprobación ": es una pena que las personas que llaman no puedan reparar su código. Parece extraño abortar para ahorrarles la necesidad de manejar la excepción. Aún así, podría ser peor, si tomaras un puntero de función y no se molestaran en inicializarlo, entonces tendría un valor indeterminado y el comportamiento sería indefinido. Probablemente estén cometiendo un error mucho peor llamando '' strlen'' que llamando a su función. –