【问题标题】:Right way to implement operator overloading for mixed-mode arithmetic in C++在 C++ 中为混合模式算术实现运算符重载的正确方法
【发布时间】:2020-04-01 17:22:27
【问题描述】:

假设我有一些用户定义的类型 T,它有望支持混合模式算术,例如 T + 2、15 + T 和 T + T。

我可以定义 operator + 来接受不同类型的操作数:

T operator+(T a, T b) {
    return a += b;  // assume that operator += is implemented as a member function of T
}

T operator+(T a, int b) {
    // implementation
}

T operator+(int a, T b) {
    // implementation
}

如果类型 T 预计支持与许多其他类型(int、double、string 等)的算术运算,那么 T 和这些类型的组合数量及其位置(T、string/string、T)将非常高.

我的问题是是否有更优雅的方式来重载运算符以减少此类组合的数量。

【问题讨论】:

  • 您可以只实现T operator+(const T&, const T&) 函数,并确保您有适当的T 构造函数,这些构造函数采用您希望能够添加的其他类型。编译器在查找函数时最多允许每个参数进行一次转换,并且这些构造函数将提供它。如果你有 GH 类型,这可能会变得很麻烦,并且你想要一个将它们加在一起以创建一个新的 G 的概念,以及另一个创建一个新的 H 的概念。所以要小心。
  • 感谢您的回答。也许这是最简单的方法,因为我有适当的构造函数来从 int 和 string 创建 T。

标签: c++ operator-overloading


【解决方案1】:

这取决于您的用例。

很多时候你可以不用为它写一个构造函数

T(int i) {
    //construct T from int
};

并且不将其标记为显式。现在你可以通过定义来做 T + 2、15 + T 和 T + T

T operator+(T a, T b)

因为隐式转换会将您的int 转换为T。如果您需要许多不同的算术类型,您可以多次使用模板构造函数。

template <typename U, std::enable_if_t<std::is_arithmetic_v<U>, int> = 0>
T(U u) {
    //construct T from arithmetic type
};

现在同一个operator+ 将处理所有内置数字。

另一种选择是给T 一个转换运算符int,但由于您询问的是返回Toperator+,我将跳过该示例。原理是一样的,但是添加后会得到ints。

如果您的T 非常复杂,有时您只需要为其提供许多不同的运算符重载。

【讨论】:

  • 感谢您的详细解答。实际上,类型 T 表示非常大的数字,在这种类型中存储为字符串。 T 可以从 int 或 string 构造,我需要实现所有比较和算术运算符,而不仅仅是 +。但我认为在这种情况下,使用未标记为显式的构造函数的方法就足够了。
猜你喜欢
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多