Нет частичной специализации шаблона функции, потому что есть перегрузка функций (и шаблонов функций. Однако перегрузка функций гораздо более ограничена, чем специализация шаблона, поэтому вы обычно обращаетесь к специализациям шаблона класса:*
template< typename R, typename T >
struct foo_impl {
static R foo(T)
{
// ...
return R(); // blah
}
};
template< typename T >
struct foo_impl<void,T> {
static void foo(T)
{
// ...
}
};
template< typename R, typename T >
R foo(T obj);
{
return foo_impl<R,T>::foo(obj); // fine even if R is void
}