问题:重载<<
变量的默认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;
}
它运作正常。
所以我的问题是
答案 0 :(得分:0)
C ++的一个要点是generic programming和template
是实现此目的的方法。
优势非常明显:您不必多次编写相同/类似的代码片段,也不必调试/维护类似的代码片段,而只需编写一段代码。 (所有这些都属于您的“通用目的”类别,因此除此之外没有任何优势)。
实际上存在一些缺点,因为template
不是函数(或类)。函数(或类)仅在编译时从template
实际使用时创建,而您的(非模板)函数可能是预编译的。这有两个含义:(1)更多编译和(2)代码中的某些语法错误仅在template
与不能使用的参数一起使用时才会出现。例如,如果尚未定义template
,则帖子中的ostream << T
将无法编译。