2016-03-28 12 views
5

Pythonでは、int/floatを任意の力に変換する簡単な構文があります。つまり、あなた以外のPythonプログラマのために、私たちは、次のステートメントを持つことができます。** C++でのオーバーロード**

y = 2 ** 3 
print y 

これは、コンソールに8を印刷し、「電源」オペレータに建設されているとして素敵な構文があります。 C++で単一の演算子として "**"をオーバーロードすることは可能ですか?

int a = 2; 
int b = 3; 
cout << (a**b) << endl; 

か、これが不可能な場合は、このような何か:

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 

これらはまた、コンソールに8を印刷する必要があります具体的には、私はこのような何かを達成したいです。私は同じことをするために "^"演算子をオーバーライドする方がはるかに簡単だと理解していますが、私は主に "**"をオーバーロードできるかどうかを見たいと思っています。 "**"を指定する方法がわからないので、引数が別の "*"であるかどうかを調べる必要があります(MyIntクラスの場合、メンバー関数の場合は*)単一の演算子ですか?引数として演算子を渡すことも可能ですか?

可能であれば追加/ボーナス規定(私がまだ十分ではないかのように):マクロなし!

+2

これは、演算子のオーバーロードと呼ばれています、演算子がオーバーロードされるためです。 **は演算子ではありません。 – DeiDei

+1

演算子^には電源の意味で過負荷をかけないでください。==、+または - よりも優先順位が低くなりますので、多くの驚きが発生します。 –

+0

@ÖöTiib大きなポイント! – mwm314

答えて

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; 
} 

が、それはここに住んで参照してください http://coliru.stacked-crooked.com/a/ab56b9cd6e422e12

説明:

  1. 過負荷プロキシオブジェクトに
  2. 過負荷プロキシを使用するバイナリ*オペレータを返す単項*オペレータ...シンプル:-)
  3. 微妙なバグを避けるためにプロキシクラスを使用しました。

C++は楽しいです...私はちょうど呼び出し、その生産に非常に悪いアイデア原因...あなたはこの楽しみのためではなく、生産でやっていると信じたいstd::pow

+1

何かが可能であるという理由だけで、それはいいアイデアだとは限りません... –

+2

Yea ...私は知っています:-) ... OPはプロダクションコードではなく、楽しみのためにそれをやりたいと思っています。 – WhiZTiM

+0

ちょうど明確かつ明示的である:これは遊ぶための楽しい小さな試合になることができます(そして、私は自信を持ってそれを楽しんでいます)。しかし、**これを実動コードでは行いません。 、または純粋に使い捨てのコードを除いて、ゲームを楽しむためだけに書かれたもの。 –

4

短い回答:いいえC++の任意の文字/トークンシーケンスを「オーバーロードする」方法はありません。

長い答え:a**bあなた何らかの方法で総*バイナリ(すなわち乗算)と単項*(すなわち、間接参照)の両方をオーバーロードすることができるように、a * (*b)と同等です。しかし、それはあなたのコードを読んでいる人にとっては完全に不透明/予期せず、将来はデバッグ/維持するのに苦労します。

pow()という名前の関数を書きます。

+0

これは非常に汚いトリックです。 – mwm314

+0

オペレータを引数として渡すことはできません。 – mwm314

関連する問題