构建前缀运算符

时间:2012-05-03 17:11:52

标签: c++ operator-overloading

假设我有这门课程:

class Int{
    private:
        int x;
    public:
        Int(int i) : x(i) {}
};

我可以构建一个prefix +运算符来编写表达式x = + a b吗?

我试图在类中重载operator+,但编译器抱怨operator+必须是一元或二元而不是三元。

有没有办法做这样的事情?

4 个答案:

答案 0 :(得分:4)

不,你不能改变表达式的基本语法。

答案 1 :(得分:3)

您无法更改编译器解释'+'字符的方式 - 它具有特殊的语法意义。但是,如果您愿意放弃+符号,则可以创建一个名为plus的类并重载operator()以获取其以下参数。

基本上,您使用plus类作为+运算符的代理来创建dsl。

答案 2 :(得分:3)

一般来说,不可能使用C ++的基本语法,因为它是硬连线的语法。但也许

template<typename A, typename B>
auto plus(const A& a, const B& b) -> decltype(a + b) { return a + b; }
a = plus(a, b);

是否合适?为所有算术运算符构建它是微不足道的。

答案 3 :(得分:2)

只是为了好玩:

#include <iostream>

struct Expr {
  int value;
  enum oper { plus = '+', minus = '-', times = '*', div = '/', nop = 0 } op;
  Expr(int value, oper op) : value(value), op(op) { }
  Expr(int value) : value(value), op(nop) {}
  Expr operator+() { return Expr(value, plus); }
  Expr operator-() { return Expr(value, minus); }
  Expr operator*() { return Expr(value, times); }
  Expr operator,(const Expr& rhs) {
    Expr result(value, op);
    switch(op) {
      case '+': result.value += rhs.value; break;
      case '-': result.value -= rhs.value; break;
      case '*': result.value *= rhs.value; break;
      case '/': result.value /= rhs.value; break;
    }
    return result;
  }
};

int main () {
  Expr x(0), a(1), b(2);
  x = ( + a , b );
  std::cout << x.value << "\n";
}