【发布时间】:2017-01-20 15:35:47
【问题描述】:
问题:为vector<int> v 变量重载默认的<< 运算符,以便cout << v 将按顺序打印每个元素。在这里,我看到了 Jason Iverson 在previous question 中提出的一个选项
template<typename T>
std::ostream& operator<<(std::ostream& s, std::vector<T> t) {
s << "[";
for (std::size_t i = 0; i < t.size(); i++) {
s << t[i] << (i == t.size() - 1 ? "" : ",");
}
return s << "]" << std::endl;
}
显然这应该适用于任何类型的元素,但是由于我只关心int,因此我将函数简化为
ostream& operator << (ostream &os, const vector<int> &v){
for (auto x: v){
os << " " << x;
}
return os;
}
效果很好。
所以我的问题是
- 就
vector<int> v而言,不使用template的注意事项是什么? - Jason的方案除了通用之外,还有什么优势?
谢谢!
更深层次的想法:
上述问题措辞不佳,多亏了 cmets,我相信重新措辞是有意义的。
问题:在 C++ 中,在单一类型函数就足够的情况下,使用template 的成本是多少?
【问题讨论】:
-
你知道
template是什么吗?如果是,你为什么要问,如果不是,去了解一下。 -
你需要什么比通用/不必自己编写重载的优势?
-
@Walter 我知道
template,但想了解它的优势,而不是通过不指定类型T来更笼统。 -
重载 != 函数模板。使用函数模板,您可以为大量类型提供一段代码,而对于重载,您必须定义它们中的每一个。加上 SFINAE。加上编译过程中的模板/功能差异。这就像将苹果与橙子进行比较。
-
@NathanOliver 这里我只关心整数类型向量,所以我认为重载运算符就足够了,这种类型应该没问题。另一方面,定义模板是否会给程序带来额外的开销。我要问的一个原因是我很少看到代码在类外重载默认运算符。
标签: c++ c++11 vector operator-overloading