У меня есть шаблонная функция для преобразования объекта в строку (это из библиотеки, я не могу это изменить):
template <typename Q> std::wstring ToString(const Q& q) { static_assert(false, "Must specialise"); }
Теперь я хочу вызвать его с параметром std::vector<Gene>
, где Gene
— это простой класс, детали которого не важны. Конечно, для этого мне нужно специализировать шаблон, поэтому я делаю:
template<> std::wstring ToString(const std::vector<Gene>& q){...}
Предположим, у меня есть другой класс, Cell
, и я хочу специализировать функцию ToString
для класса std::vector<Cell>
. Мне пришлось бы сделать еще одну явную специализацию с тем же телом, что и у версии std::vector<Gene>
.
Логика преобразования std::vector
не зависит от фактического типа контента (int, Gene
, Cell
, еще один std::vector
и т. д.), поэтому имеет смысл создать специализацию шаблона, которая может работать с любым std::vector
. Но я не могу найти простой способ сделать это. На данный момент у меня есть функция VectorToString
, и я перенаправляю вызовы от ToString(std::vector<Gene>>)
и ToString(std::vector<Cell>)
, но это все еще требует от меня реализации специализации для каждого типа элемента.
Итак, к собственно вопросу: можно ли создать единую специализацию для произвольного std::vector
и как мне это сделать? И, в качестве бонуса, можно ли обобщить это на любую произвольную коллекцию, которая поддерживает std::begin
и std::end
?
Я просмотрел этот этот вопрос и попытался объявить специализацию следующим образом:
template<typename E> std::wstring ToString<std::vector<E>>(const std::vector<E>& t){...}
но это не удается с C2768: незаконное использование явных аргументов шаблона (компилятор не смог определить, должно ли определение функции быть явной специализацией шаблона функции или должно ли определение функции быть для новой функции.), что имеет смысл, поскольку у нас одинаковое имя функции и количество параметров шаблона, а также аналогичная сигнатура.
Для справки: я использую Visual C++ 2015 RC, а исходная функция шаблона происходит из родной тестовой библиотеки.