2012-05-03 3 views
2

한다고 가정 빌드?나는이 클래스가 접두사 연산자

클래스 내에 operator+을 오버로드하려고했지만 컴파일러에서 operator+이 3 진이 아닌 1 진 또는 2 진수 여야한다고 불평했습니다.

그런 일을 할 수있는 방법이 있습니까?

+0

당신은'= +'를 의미하는 무엇을 원하는가? 서면으로, 이것은 대수적 난센스입니다. –

+2

아니, Lisp을 C++로 작성하는 방법은 없지만 (우리가 원할지라도). (우연히도 'x = + a'는 작동하지만'x = + a b '는 안됩니다.) –

+0

@JohnDibling : 그는 [Prefix Notation] (http://en.wikipedia.org/wiki/Polish_notation)을 설명하고 있습니다. –

답변

3

'+'문자가 컴파일러에 의해 해석되는 방식을 변경할 수 없습니다. 특수 구문의 의미가 있습니다. 그래도 + 기호를 포기할 경우 plus 클래스를 만들고 overload 연산자()를 사용하여 다음 인수를 취할 수 있습니다.

기본적으로 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"; 
} 
관련 문제