Stringify рекурсивного `std :: vector > `без частичной специализации шаблонной функции - PullRequest
2 голосов
/ 16 февраля 2020

Я стремлюсь (например) к строковому вектору векторов ... (с произвольно глубокой вложенностью).

Я пробовал следующее:

#include <iostream>
#include <sstream>
#include <vector>

template<typename E>
std::string toString(const E& element) {
    std::ostringstream oss;
    oss << element;
    return oss.str();
}

template<typename E>
std::string toString<std::vector<E>>(const std::vector<E>& set) {
    std::ostringstream oss;
    oss << "{";
    bool started = false;
    for (const auto& el : set) {
        if (started) {
            oss << ",";
        }
        else {
            started = true;
        }
        oss << toString(el);
    }
    oss << "}";
    return oss.str();
}

int main()
{
  std::vector<std::vector<int>> v{{1},{2,3}};
  std::cout << toString(v) << std::endl; // want to output "{{1},{2,3}}"
  return 0;
}

но это генерирует ошибку компилятора , поскольку частичная специализация шаблонной функции явно не разрешена. Как мне тогда делать такие вещи?

1 Ответ

3 голосов
/ 16 февраля 2020

Здесь вам нужна не специализация шаблона, а перегрузка функций.

Используйте это вместо метода специализации шаблона.

template <typename E>
std::string toString(const std::vector<E>& set) {
    std::ostringstream oss;
    oss << "{";
    bool started = false;
    for (const auto& el : set) {
        if (started) {
            oss << ",";
        }
        else {
            started = true;
        }
        oss << toString(el);
    }
    oss << "}";
    return oss.str();
}

Ваш код также имеет опечатку: oss << toSring(el).

...