Этот ответ основан на этом забавном факте : в функции, возвращающей void
, вы можете вернуть любое выражение, тип которого не имеет значения.
Таким образом, простое решение:
virtual T Execute() const
{
if (comm)
return comm();
else
return static_cast<T>(NULL);
}
Когда T = void
, последний оператор возврата эквивалентен return;
.
Однако я считаю, что это плохой дизайн.Имеет ли значение NULL
для каждый T
?Я так не думаю.Я бы бросил исключение:
virtual T Execute() const
{
if (comm)
return comm();
else
throw std::runtime_error("No function!")
}
Однако, это делается автоматически с помощью Boost , поэтому ваш код становится намного чище:
virtual T Execute() const
{
return comm();
}
Тогда вы можетедобавить дополнительные функции, такие как:
bool empty(void) const
{
return !comm; // or return comm.empty() if you're the explicit type
}
, чтобы пользователь мог проверить, может ли он быть вызван до вызова.Конечно, на данный момент, если у вашего класса нет дополнительных функций, которые вы исключили ради вопроса, я не вижу причин, чтобы просто не использовать boost::function
во-первых.