字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化

Stringify a recursive `std::vector<std::vector<...>>` without using partial template function specialization

本文关键字:lt vector gt std 专用 用部 函数 字符串 递归      更新时间:2023-10-16

我寻求(例如(字符串化...(具有任意深度嵌套(。

我尝试了以下方法:

#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;
}

但它会生成编译器错误,因为显然不允许部分模板函数专用化。那我该怎么做这种事情呢?

这里你想要的不是模板专用化,而是函数重载。

使用此方法代替模板专用化方法。

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)