C ++重载运算符,有/没有定义模板

时间:2017-01-20 15:35:47

标签: c++ c++11 vector operator-overloading

问题:重载<<变量的默认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;
}

它运作正常。

所以我的问题是

  1. vector<int> v而言,不使用template的警告是什么?
  2. 除了通用之外,Jason的解决方案有什么优势?
  3. 谢谢!

    更深的想法: 上面的问题措辞很差,并且由于这些评论,我认为将其改写是有意义的。 问题:在C ++中,在单一类型函数足够的情况下使用template的成本是多少?

    @Marco A@Walter的积分,此问题可能会被关闭。

1 个答案:

答案 0 :(得分:0)

C ++的一个要点是generic programmingtemplate是实现此目的的方法。

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

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