Как известно большинству программистов на C++, частичная спецификация шаблонов свободных функций запрещена. Например, следующее незаконно С++:
template <class T, int N>
T mul(const T& x) { return x * N; }
template <class T>
T mul<T, 0>(const T& x) { return T(0); }
// error: function template partial specialization ‘mul<T, 0>’ is not allowed
Тем не менее, допускается частичная специализированная специализация классов/структур и может быть использована для имитации функциональных возможностей частичной специализированности шаблонов свободных функций. Например, цель цели в последнем примере может быть достигнута с помощью:
template <class T, int N>
struct mul_impl
{
static T fun(const T& x) { return x * N; }
};
template <class T>
struct mul_impl<T, 0>
{
static T fun(const T& x) { return T(0); }
};
template <class T, int N>
T mul(const T& x)
{
return mul_impl<T, N>::fun(x);
}
Он более громоздкий и менее краткий, но он выполняет свою работу - и в отношении пользователей mul
они получают желаемую частичную специализацию.
Мои вопросы: при написании шаблонных бесплатных функций (предназначенных для использования другими), следует ли автоматически делегировать реализацию функции статического метода класса, чтобы пользователи вашей библиотеки могли осуществлять частичную специализацию по желанию, или вы просто пишете шаблонную функцию обычным способом и живете с тем, что люди не смогут их специализировать?