C++带有/不定义模板的重载运算符

C++ overloading operator with/without defining a template

本文关键字:重载 运算符 定义 带有 C++      更新时间:2023-10-16

>问题:重载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;
}

它只是工作正常。

所以我的问题是

  1. vector<int> v而言,不使用template有什么注意事项?
  2. 除了通用之外,Jason的解决方案还有什么优势?

谢谢!


更深层次的思考:上面的问题措辞很差,多亏了评论,我认为改写它是有意义的。问题:在C++中,使用template单类型函数就足够了,成本是多少?


学分 @Marco A 和 @Walter,这个问题可以结束了。

C++的

要点之一是泛型编程template是做到这一点的方法。

优点非常明显:您不必多次编写相同/相似的代码段,也不必调试/维护类似的代码段,而只需一段代码。(所有这些都属于您的"通用"类别,因此除此之外没有任何优势)。

实际上有一些缺点,因为template不是函数(或类)。函数(或类)只会在实际使用时从template创建,而您的(非模板)函数可能是预编译的。这有两个含义:(1)更多的编译和(2)代码中的某些语法错误仅在template与它们不起作用的参数一起使用时才会出现。例如,如果尚未定义ostream << T,则帖子中的template将不会编译。