【发布时间】:2020-08-29 01:51:28
【问题描述】:
我从 haskell 和 python 开始使用 C++,那里有将数据类型转换为字符串的内置方法。
例如,在Haskell中有一个多态函数show。
我有兴趣在 C++ 中创建一些类似的模板函数。
例如,我们可以将vector<int> 转换为类似这样的字符串。
string toString(vector<int> v)
{
ostringstream o;
for (int elem: v)
o << elem << " ";
return o.str()
}
这会将ints 的字符串表示形式全部放在一行上。现在,如果我想以这种方式转换 vector<vector<int> > 怎么办。
string toString(vector<vector<int> > v)
{
ostringstream o;
for (auto elem : v)
{
o << toString(elem) << "\n";
}
}
我的问题是:如果我想创建一个与vector<class A> 和vector<vector<class A> 一起使用的多态toString 怎么办?我该怎么办?
我需要添加一些功能来将类型class A 转换为std::string:我是否只为该类型提供至少一个toString 的特化?模板机制能解决这一切吗?
或者是否已经有代码可以做到这一点?
【问题讨论】:
-
如果您只是将
int替换为通用T,即模板化您拥有的两个函数,那应该可以工作。 -
“多态”是指类,而不是函数。更好的词选择是“a generic
toString”。 -
通过明智地使用模板和技术(如 SFINAE)或 C++20 中的概念,可以在特定范围内执行此类操作。这些都是相当高级的、深入的话题。对学习 C++ 比较陌生的人可能还没有准备好应对这些野兽,继续学习这种当今使用的最复杂的通用编程语言会更有成效,直到上述技术成为第二天性(不,没有代码已经这样做了)。
-
你能添加一些你想工作的示例代码吗?
-
@JaMiT 那只是 C++ 吗?因为我的理解是 Haskell 将泛型函数称为多态,也许其他语言也是如此。
标签: haskell python c++ templates stdvector stdstring function-templates