Esta respuesta se basa en this fun-fact: en una función que devuelve void
, puede devolver cualquier expresión cuyo tipo sea nulo.
Así que la solución es sencilla:
virtual T Execute() const
{
if (comm) // boolean logic change, typo in OP?
return comm();
else
return static_cast<T>(NULL);
}
Cuando T = void
, la última instrucción de retorno es equivalente a return;
.
Sin embargo, siento que este es un mal diseño. ¿Es NULL
significativo para cadaT
? No lo creo. Me gustaría lanzar una excepción:
virtual T Execute() const
{
if (comm)
return comm();
else
throw std::runtime_error("No function!")
}
Sin embargo, esto se hace automatically by Boost, por lo que su código se convierte en la más limpia:
virtual T Execute() const
{
return comm();
}
A continuación, puede añadir funcionalidad adicional, como por ejemplo:
bool empty(void) const
{
return !comm; // or return comm.empty() if you're the explicit type
}
Para que el usuario pueda verificar si se puede llamar antes de llamarlo. Por supuesto, en este punto, a menos que su clase tenga funcionalidades adicionales que haya omitido por el bien de la pregunta, no veo ninguna razón para no usar simplemente boost::function
en primer lugar.
¿Se supone que es 'if (comm)'? – GManNickG
De hecho. Solucionado ahora –