2

私がこのクラスを持っているとしましょう:

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

prefix +そのような式を書くための演算子を作成できますx = + a bか?

operator+クラス内で オーバーロードしようとしましたが、コンパイラは、operator+単項または二項であり、三項ではないと文句を言います。

そのようなことをする方法はありますか?

4

4 に答える 4

4

いいえ、式の基本的な構文を変更することはできません。

于 2012-05-03T17:13:51.003 に答える
3

'+'文字がコンパイラーによって解釈される方法を変更することはできません-それは特別な構文上の重要性を持っています。ただし、+記号をあきらめたい場合は、plusoperator()というクラスを作成して、次の引数を取ることができます。

基本的に、plusクラスを+演算子のプロキシとして使用してDSLを作成しています。

于 2012-05-03T17:19:28.373 に答える
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);

適切な代替品ですか?すべての算術演算子に対してこれを構築するのは簡単です。

于 2012-05-03T17:19:45.700 に答える
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";
}
于 2012-05-03T19:18:41.910 に答える