当我定义自己的数据类型时,我还可以通过operator
全局重载适当的函数来定义运算符:
struct Stuff {};
Stuff operator+(Stuff, Stuff) { return Stuff{}; }
然后我可以像中缀一样使用它,但仍然可以通过函数符号来解决它。所以这很好:
Stuff x;
Stuff y;
Stuff a = x+y; // using infix-notation
Stuff b = operator+(x,y); // using the function-notation
但是int
(例如)已经有一个+
定义。
有没有办法在函数符号而不是中缀符号中调用int operator+(int,int)
(如果我可以这样引用它)?
当我尝试
int aa = 12;
int bb = operator+(a, 6); // err
int cc = ::operator+(a, 6); // err
我收到诸如“操作员+未定义”之类的错误。我是否错误地解决了该功能,或者这对于内置函数是不可能的?
奖励:如果我编写一个模板,我会对不同类型的参数有不同的行为,然后:
template<typename T>
T add_op(T a, T b) { return a+b; }
template<typename T>
T add_fun(T a, T b) { return operator+(a,b); } // failing for int
int main() {
int am = add_op(3, 4); // ok
int bm = add_fun(3, 4); // fail
Stuff um = add_op(Stuff{}, Stuff{}); // ok
Stuff vm = add_fun(Stuff{}, Stuff{}); // ok
}
这似乎很奇怪,我想知道是否有一种方法可以add_fun
使用函数符号来编写+
,或者我是否必须坚持中缀-+
作为模板中的规则。