한다고 가정 빌드?나는이 클래스가 접두사 연산자
클래스 내에 operator+
을 오버로드하려고했지만 컴파일러에서 operator+
이 3 진이 아닌 1 진 또는 2 진수 여야한다고 불평했습니다.
그런 일을 할 수있는 방법이 있습니까?
한다고 가정 빌드?나는이 클래스가 접두사 연산자
클래스 내에 operator+
을 오버로드하려고했지만 컴파일러에서 operator+
이 3 진이 아닌 1 진 또는 2 진수 여야한다고 불평했습니다.
그런 일을 할 수있는 방법이 있습니까?
아니요 식의 기본 구문을 변경할 수 없습니다.
일반적으로 C++의 기본 구문을 사용하는 것은 불가능합니다. 문법에 포함되어 있기 때문입니다. 하지만 아마도
template<typename A, typename B>
auto plus(const A& a, const B& b) -> decltype(a + b) { return a + b; }
a = plus(a, b);
이 적합한 대체품입니까? 모든 산술 연산자에 대해 이것을 작성하는 것은 간단합니다. 그냥 재미를 위해
:
#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";
}
당신은'= +'를 의미하는 무엇을 원하는가? 서면으로, 이것은 대수적 난센스입니다. –
아니, Lisp을 C++로 작성하는 방법은 없지만 (우리가 원할지라도). (우연히도 'x = + a'는 작동하지만'x = + a b '는 안됩니다.) –
@JohnDibling : 그는 [Prefix Notation] (http://en.wikipedia.org/wiki/Polish_notation)을 설명하고 있습니다. –