Вы не можете частично специализировать функцию, вы можете только полностью специализировать ее, поэтому вы можете предоставить специализацию для double
, но не для array<U>
, где U
является универсальным типа.
Вы можете обойти это ограничение, используя шаблон класса и частично специализируя его, но оно будет немного громоздким.
namespace detail {
template <typename T>
struct array_printer {
static std::string print( array<T> const & array ) {
// basic implementation
}
};
template <typename T>
struct array_printer< array<T> > {
static std::string print( array< array<T> > const & array ) {
// specialization for array<T>
}
}
}
А затем реализовать функцию-член в виде простой отправки с соответствующей перегрузкой:
template <typename T>
class array : std::vector<T> { // do not publicly derive from STL containers
public:
std::string printToString() const {
return detail::array_printer<T>::print( *this );
}
}
Конечно, в реальном коде все немного сложнее, и вам придется соответствующим образом упорядочить код и предоставить предварительные объявления шаблонов и все такое, но этого должно быть достаточно, чтобы начать работу.