C++带有/不定义模板的重载运算符
C++ overloading operator with/without defining a template
>问题:重载vector<int> v
变量的默认<<
运算符,以便cout << v
按顺序打印每个元素。在这里,我看到了杰森·艾弗森在上一个问题中提出的一个选项
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的解决方案还有什么优势?
谢谢!
更深层次的思考:上面的问题措辞很差,多亏了评论,我认为改写它是有意义的。问题:在C++中,使用template
单类型函数就足够了,成本是多少?
学分 @Marco A 和 @Walter,这个问题可以结束了。
C++的
要点之一是泛型编程,template
是做到这一点的方法。
优点非常明显:您不必多次编写相同/相似的代码段,也不必调试/维护类似的代码段,而只需一段代码。(所有这些都属于您的"通用"类别,因此除此之外没有任何优势)。
实际上有一些缺点,因为template
不是函数(或类)。函数(或类)只会在实际使用时从template
创建,而您的(非模板)函数可能是预编译的。这有两个含义:(1)更多的编译和(2)代码中的某些语法错误仅在template
与它们不起作用的参数一起使用时才会出现。例如,如果尚未定义ostream << T
,则帖子中的template
将不会编译。
相关文章:
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 在 myVector 类中重载运算符 + 时出错
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 如何在 cpp 中重载运算符 +=?
- C++ 如何重载 [] 运算符并进行函数调用
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 重载运算符有地址吗?
- 如何迭代重载运算符 [] 的类?
- 重载运算符与添加问题
- 模板基类中的重载运算符
- 如何调用用于重载运算符"<<"的 friend 函数?
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- 重载运算符<<采用谷歌 C++ 风格
- C++ 如何正确重载 + 运算符
- cout (<<) 重载运算符不打印减去的矩阵
- 如何在 c++ 中重载运算符 + 以便能够 whrite c_str = "smth" + c_str;
- 重载运算符*以获取对另一个类的实例的引用