частичная специализация шаблона функции - лучшие практики

как и большинство программистов должны знать, частичной специализации шаблона функции не допускается. например, следующее является незаконным в 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
is

однако, частичной специализацией шаблона классов/структур животных, и может быть использована, чтобы имитировать функциональность частичной специализации шаблона функции. например, цель в последнем примере может быть достигнуто с помощью:

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

это более громоздкие и менее лаконичное, но он получает работу, и насколько пользователи заинтересованы, они получают желаемое частичной специализации.

мои вопросы: когда писать шаблонных функций (которые предназначены, чтобы использоваться другими лицами), должны вы автоматически делегировать реализацию статического метода функции класса, так что пользователи вашей библиотеки может реализовать частичной специализации по желанию, или вы просто пишите шаблонные функции обычным способом, и жить с тем, что люди не смогут специализируется на них?