运算符重载使用模板

时间:2018-02-23 15:51:05

标签: c++ templates operator-overloading template-function

我正在编写一个名为 Double 的类,它在c ++中扩展了内置类型'double'。它有一个'double'类型的数据成员。对于 Double 类,我需要重载许多基本算术运算符,如“+”,“ - ”,“*”,“/”。例如,“+”运算符以这种方式重载:

Relation<Double>* operator+ (Double &d2)   
// Relation is a abstract class template.
{
   /*
   ...code that do something else.
   */ 
   return new Plus<Double>(this, &d2);   // Plus is derived from Relation.
}                             
// Double + Double returns a Relation pointer.

并且“ - ”运算符以相同的方式快速重载:

Relation<Double>* operator- (Double &d2)
{
   /*
   ...code that do something else but the same as above.
   */ 
   return new Minus<Double>(this, &d2);
}

实际计算由 Relation 类中的成员函数完成。操作员身体的唯一区别是初始化对象(加号 vs 减号)。 对于只需要两个操作数的运算符,我应该总是像这样进行重载,这是重复的而不是很好。 所以我想到了模板功能。但问题是,我可以将 Plus Minus 作为模板参数传递,但不能传递运算符。我怎样才能制作模板或使用其他方法来重载这些运算符?

1 个答案:

答案 0 :(得分:0)

是的,运算符重载可能是一个痛苦和代码重复的来源,请参阅this suggestion to the standard以简化它。

现在我唯一可以想到的是这样的事情:

template<typename T>
struct OperatorMinus {
  static T doIt(T const& lhs, T const& rhs) { return lhs - rhs; };
}

template<typename T>
struct OperatorPlus {
  static T doIt(T const& lhs, T const& rhs) { return lhs + rhs; };
}

template<typename T, typename U>
class Operator: public Relation<T>
  public:
  Operator(T const& lhs, T const& rhs): _lhs(lhs), _rhs(rhs) {}

  T doIt() override {
    return U::doIt(_lhs, _rhs);
  }

  private:
  T _lhs;
  T _rhs;
};

Relation<Double>* operator+ (Double &d2)   
{
   return new Operator<Double, OperatorPlus<Double>>(this, &d2);
}