假设我有这个类:
class Int{
private:
int x;
public:
Int(int i) : x(i) {}
};
我可以建立一个prefix +
运算符来编写这样的表达式x = + a b
吗?
我试图operator+
在类内部重载,但编译器抱怨 operator+
必须是一元或二进制而不是三元。
有没有办法做这样的事情?
假设我有这个类:
class Int{
private:
int x;
public:
Int(int i) : x(i) {}
};
我可以建立一个prefix +
运算符来编写这样的表达式x = + a b
吗?
我试图operator+
在类内部重载,但编译器抱怨 operator+
必须是一元或二进制而不是三元。
有没有办法做这样的事情?
不,您不能更改表达式的基本语法。
您无法更改编译器解释“+”字符的方式 - 它具有特殊的语法意义。但是,如果您愿意放弃 + 符号,则可以创建一个名为plus
并重载 operator() 的类来获取其以下参数。
plus
本质上,您正在使用该类作为 + 运算符的代理来创建 dsl 。
一般来说,不可能摆弄 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";
}