字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
Stringify a recursive `std::vector<std::vector<...>>` without using partial template function specialization
我寻求(例如(字符串化...(具有任意深度嵌套(。
我尝试了以下方法:
#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)
。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 在某些循环内使用vector.push_back时出现分段错误
- 当vector是tje全局变量时,c++中vector的内存管理
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- std::vector的包装器,使数组的结构看起来像结构的数组
- 呼叫运营商<<临时
- 为什么(-1)%vector::size()总是返回0
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在C++中将类(带有Vector成员)保存为二进制文件
- 编译器如何区分std::vector的构造函数
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- std::vector::reserve(未知m),我知道m<<;N(通常)并且知道N
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- C++重载<<具有typedef'd std::vector
- std::映射<>或std::vector<>在处理大型标志集时