在C++中重载**

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类的情况,如果它是成员函数)是否必须查看参数是否是另一个"*",因为我不知道如何指定"**"作为一个运营商?甚至可以将运算符作为参数传递吗?

如果可能的额外/奖金规定(好像我还没有说够):没有宏!!!

Oli*_*rth 5

简短的回答:不。在 C++ 中没有办法“重载”任意字符/标记序列。

更长的答案: a**b相当于a * (*b),因此您可以以某种粗略的方式重载二进制*(即乘法)和一元(即取消引用)。*但这对于任何阅读你的代码的人来说都是完全不透明/意料之外的,而且将来调试/维护起来也很痛苦。

只需编写一个名为pow()!


Whi*_*TiM 4

你的意思是这样的吗?

#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

解释:

  1. 重载一元运算符*以返回代理对象
  2. 重载二元*运算符以使用代理...简单:-)
  3. 我使用代理类来避免细微的错误。

C++ 很有趣...我想相信你这样做是为了好玩而不是在生产中...因为它在生产中是一个非常糟糕的主意,只需调用std::pow

  • 是的...我知道:-) ...我想相信OP想要这样做是为了好玩,而不是在生产代码中 (2认同)