【问题标题】:Support different types on overloaded operators?支持重载运算符的不同类型?
【发布时间】:2015-01-12 01:50:36
【问题描述】:

我有疑问,为不同类型的自定义类支持运算符是否正确? 假设我们有这个:

template<class T>
class C { /* Class implemantation */ }

int main () {

    C<int> someObject;
    C<double> otherObject;

    std::cout << someObject + otherObject;

}

对于int类型的C对象和double类型的C对象支持operator+是否正确?

【问题讨论】:

  • C 一般支持这两种类型吗?有没有一种有意义的方式来为这两种类型实现 + 运算符?
  • 这取决于你。你可以让它自动工作。您可以制作它,以便用户需要制作一个 static_cast (转换运算符)。或者你可以禁止它。自动的问题是哪种类型应该优先?

标签: c++


【解决方案1】:

逻辑上是否正确取决于您(类设计者)希望如何使用您的类。添加someObjectotherObject 是否合乎逻辑?添加23.5 是有意义的,但这并不能说明这是否适合您的代码。作为反例,您不能添加 basic_string&lt;char&gt;basic_string&lt;wchar&gt; - 添加没有意义,因为您必须存储相同类型的字符 - 但您可以添加两个 @ 987654327@,对于任何T

您当然可以编写代码来执行此操作,但要确定 ??

template <typename T>
class C {
    ..
    template <typename U>
    C<??> operator+(const C<U>& rhs) {
        // ..
    }
};

【讨论】:

  • 感谢您的回答,非常有启发性。首先,我认为我应该只使用相同类型的对象,并且也只支持相同类型的运算符。
【解决方案2】:

如果您希望特定运算符对特定类型的类的特化进行操作,您始终可以编写专门的运算符重载,例如:

template<class T>
class C { /* implementation */ };

C<double> operator+ (C<int> a, C<double> b)
{
  C<double> ret;
  // Do something to ret given a and b
  return ret;
}

// Lets make it commutative (is that the right word?)
C<double> operator+ (C<double> a, C<int> b)
{
  return b + a;
}

int main(int argc, char** argv)
{
  C<int> a;
  C<double> b;

  C<double> ret1 = a + b;
  C<double> ret2 = b + a;

  return 0;
}

这取决于您想要实现的行为。

【讨论】:

  • 嘿!谢谢!它非常有帮助。有一些方法可以在没有模板专业化的情况下实现您的建议?
  • 也许吧,但这完全取决于你想做什么。
猜你喜欢
  • 2010-12-07
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多