2012-05-03 10 views
2

に接頭演算子をビルドします。私は、このクラスがあるとし

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

は私が表現などx = + a bを書くprefix +オペレータを構築できますか?

operator+をクラス内にオーバーロードしようとしましたが、コンパイラはoperator+が単項または二進で、三項でなければならないと不平を言っています。

このようなことはありますか?

+0

あなたは、 '= +'を意味するために何をしたいですか?書いたように、これは代数的なナンセンスです。 –

+2

いいえ、LispをC++で書く方法はありません。 (同時に、 'x = + a'は動作しますが、' x = + a b'は動作しません) –

+0

@JohnDibling:彼は[Prefix Notation](http://en.wikipedia.org/wiki/Polish_notation)を記述しています。 –

答えて

3

'+'文字がコンパイラによって解釈される方法を変更することはできません。構文上重要な意味を持ちます。しかし、+記号をあきらめたい場合は、plusというクラスを作成し、operator()をオーバーロードして次の引数を取ることができます。

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

+0

ああ、多分私は持っています。パーサのために不可能なのですか? '+ x x'を書くと、一致する構文規則はありません。それは多かれ少なかれ正しいのでしょうか? – Aslan986

+1

はい、それです。 – Matt

4

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

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); 

は適切な代替品ですか?これをすべての算術演算子に対して構築するのは簡単です。ちょうど楽しみのため

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"; 
} 
関連する問題