我目前正在c++17中实现一个简单的堆栈,它必须有一个toString
-方法,可以处理以std::vector
为模板类型的其他类型。
我最初的问题是,std::to_string
不能接受向量。我在正常实现的基础上添加了一个向量的专用实现:
template <class T> std::string SweCpp::Stack<T>::toString()
{
std::string result = "SweCpp::Stack[";
for (int a = 0; a < top + 1; a++)
{
T element = st[a];
result += std::to_string(element);
if (a != top) {
result += ", ";
}
}
result += "]";
return result;
}
template <> std::string SweCpp::Stack<std::vector<double>>::toString() {
std::string result = "SweCpp::Stack[";
for (int a = 0; a < top + 1; a++)
{
std::vector<double> element = st[a];
std::string vecAsString = "Vector{";
for (double value : element) {
vecAsString += std::to_string(value) + ",";
}
vecAsString += "}";
result += vecAsString;
if (a != top) {
result += ", ";
}
}
result += "]";
return result;
}
这个想法是为向量的每个元素调用to_string
,并构建一个类似的字符串。问题是,我不知道如何使double
任意。我如何实现它,以便可以传递任何类型的向量,例如std::vector<int>
和std::vector<std::string>
?
也许是这样的东西:
template <typename T>
std::string MyToString(const T& val) {
return std::to_string(val);
}
template <typename T>
std::string MyToString(const std::vector<T>& vec) {
std::string vecAsString = "Vector{";
for (const auto& value : vec) {
vecAsString += MyToString(value) + ",";
}
vecAsString += "}";
return vecAsString;
}
现在像第一个例子一样实现Stack<T>::toString()
,但调用MyToString
代替std::to_string