Во-первых,
template <typename IMPL, typename RET>
RET call (functor <IMPL> func,
IMPL * impl)
{
return func.call (impl);
}
действительно должно быть
template <typename RET, typename IMPL>
RET call (functor <IMPL> func,
IMPL * impl)
{
return func.call (impl);
}
(я инвертировал RET
и IMPL
в списке аргументов шаблона), чтобы вы могли вызывать функцию как
call<int>(f, impl);
вместо необходимости набирать
call<impl_type, int>(f, impl);
Действительно, компилятор не может вывести RET
, поэтому вы должны предоставить его самостоятельно.
Во-вторых, вам не нужно перегружать void
, поскольку нормально возвращать выражение void
. Если вы хотите, вы можете добавить перегрузку:
template <typename IMPL>
void call(functor<IMPL> func, IMPL* impl)
и используйте call(f, impl)
при вызове этой перегрузки.
Если у вас есть доступ к C ++ 0x, рассмотрите возможность использования decltype
.