【问题标题】:C++ overloading operator with/without defining a template有/没有定义模板的 C++ 重载运算符
【发布时间】: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;
}

效果很好。

所以我的问题是

  1. vector&lt;int&gt; v而言,不使用template的注意事项是什么?
  2. Jason的方案除了通用之外,还有什么优势?

谢谢!


更深层次的想法: 上述问题措辞不佳,多亏了 cmets,我相信重新措辞是有意义的。 问题:在 C++ 中,在单一类型函数就足够的情况下,使用template 的成本是多少?


感谢@Marco A@Walter,这个问题可以结束了。

【问题讨论】:

  • 你知道template 是什么吗?如果是,你为什么要问,如果不是,去了解一下。
  • 你需要什么比通用/不必自己编写重载的优势?
  • @Walter 我知道template,但想了解它的优势,而不是通过不指定类型T 来更笼统。
  • 重载 != 函数模板。使用函数模板,您可以为大量类型提供一段代码,而对于重载,您必须定义它们中的每一个。加上 SFINAE。加上编译过程中的模板/功能差异。这就像将苹果与橙子进行比较。
  • @NathanOliver 这里我只关心整数类型向量,所以我认为重载运算符就足够了,这种类型应该没问题。另一方面,定义模板是否会给程序带来额外的开销。我要问的一个原因是我很少看到代码在类外重载默认运算符。

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


【解决方案1】:

C++ 的一个要点是generic programmingtemplates 是这样做的方式。

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

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

【讨论】:

  • 拥有这样的多功能性有什么缺点吗,或者它的成本与定义一个窄范围的函数一样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多