【问题标题】:What happens when I overload an operator as a template?当我将运算符重载为模板时会发生什么?
【发布时间】:2017-01-18 18:12:05
【问题描述】:

我正在写一些笔记,只是为了编译,我为ostream添加了一个operator<<重载函数作为template。它编译得很好,但是,因为我在 <>template 中重载了运算符 class type 并将该类型作为重载函数的第二个输入传递,所以它不会对我的每个类都使用新运算符从现在开始定义? 这是我的代码供参考。 它纯粹是为了笔记的目的,它没有任何功能。

template <class type>
ostream& operator<< (ostream& s, type x){
  s << x.getsmth();
  //...
}

【问题讨论】:

  • “它不会对我从现在开始定义的每个类都使用 new 运算符吗?” 基本上是的。这就是为什么添加这样一个模板化的重载是不明智的。
  • 当然,如果编译器没有找到调用的方法,它会发疯似的抱怨。我就是这么想的。
  • 不适用于每个类,仅适用于那些没有另一个具有更好匹配的重载(例如特定于该类)并且与您定义的模板位于相同命名空间的那些(由于@987654321 @ 规则)。

标签: c++ templates operators


【解决方案1】:

我自己是 SFINAE 的新手,但看起来你是对的,这个模板将用于不提供 getsmth() 的类,即使正文没有编译。不过,您可以使用 SFINAE 防止这种情况发生,这似乎按预期工作:

template <class T, typename = decltype(T().getSomething())>
std::ostream& operator<< (std::ostream& s, T& x){
  s << x.getSomething();
  return s;
}

演示:http://cpp.sh/8fyk

【讨论】:

  • 是的,您实际上可以这样做,但有什么意义呢?如果您只是在类中定义它,它将为您省去麻烦。我想你可以做另一件事。在任何类之外定义方法,然后添加friend,后跟所需的类的第一行。虽然这只适用于具有子类的类。
  • 这个例子适用于任何定义了成员函数getSomething的类。它将与来自外部代码的类一起使用,并且不会将您的类绑定在特定的层次结构中。如果你想在你的任何类中添加一个函数print 并让这个函数工作,它也可能很有用。
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2015-11-13
  • 2015-09-15
相关资源
最近更新 更多