Mat*_*ith 5 c++ operator-overloading operators operator-keyword
在Python中,我们有一个很好的简单语法来将任意int/float赋予幂.也就是说,对于非Python程序员,我们可以有以下声明:
y = 2 ** 3
print y
Run Code Online (Sandbox Code Playgroud)
这将打印8到控制台,并具有良好的语法,因为有一个内置的"电源"操作符.是否可以在C++中将"**"重载为单个运算符?具体来说,我想完成这样的事情:
int a = 2;
int b = 3;
cout << (a**b) << endl;
Run Code Online (Sandbox Code Playgroud)
或者,如果这是不可能的,这样的事情:
MyInt a = new MyInt(2); // Wrapper class around ints to play nicely with **
MyInt b = new MyInt(3);
cout << (a**b) << end; // Assume ostream overridden for MyInt
Run Code Online (Sandbox Code Playgroud)
这些也应该打印8到控制台.我理解覆盖"^"运算符来做同样的事情要容易得多,但我最感兴趣的是看是否可以重载"**".运算符"*"(对于MyInt类的情况,如果它是成员函数)是否必须查看参数是否是另一个"*",因为我不知道如何指定"**"作为一个运营商?甚至可以将运算符作为参数传递吗?
如果可能的额外/奖金规定(好像我还没有说够):没有宏!!!
简短的回答:不。在 C++ 中没有办法“重载”任意字符/标记序列。
更长的答案: a**b
相当于a * (*b)
,因此您可以以某种粗略的方式重载二进制*
(即乘法)和一元(即取消引用)。*
但这对于任何阅读你的代码的人来说都是完全不透明/意料之外的,而且将来调试/维护起来也很痛苦。
只需编写一个名为pow()
!
你的意思是这样的吗?
#include <iostream>
#include <cmath>
struct MyInt {
int val;
struct MyProxy { int val; };
MyProxy operator *() const{ return MyProxy{val}; }
MyInt operator * (const MyProxy& b) { return MyInt{ static_cast<int>(std::pow(val, b.val)) }; }
};
std::ostream& operator << (std::ostream& o, const MyInt& m) { return o << m.val; }
int main(){
MyInt a{5}, b{3};
std::cout << a**b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在这里观看直播http://coliru.stacked-crooked.com/a/ab56b9cd6e422e12
解释:
*
以返回代理对象*
运算符以使用代理...简单:-)C++ 很有趣...我想相信你这样做是为了好玩而不是在生产中...因为它在生产中是一个非常糟糕的主意,只需调用std::pow