2016-03-28 16 views
5

In Python haben wir schöne einfache Syntax, um eine beliebige int/float zu einer Macht zu nehmen. Das heißt, für Sie nicht-Python-Programmierer, können wir die folgende Aussage haben:Überladen ** in C++

y = 2 ** 3 
print y 

Dies wird 8 an die Konsole aus und hat schöne Syntax, da es eine in „Power“ Operator gebaut ist. Ist es möglich, "**" als einzelnen Operator in C++ zu überladen? Insbesondere möchte ich so etwas wie dies zu tun:

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

oder, falls dies nicht möglich ist, so etwas wie dieses:

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 

Diese sollten auch 8-Konsole drucken. Ich verstehe, dass es viel einfacher wäre, den Operator "^" zu überschreiben, um dasselbe zu tun, aber ich bin hauptsächlich daran interessiert zu sehen, ob ich "**" überladen kann oder nicht. Würde der Operator "*" (für den Klassenfall MyInt, wenn es eine Memberfunktion wäre) nachsehen, ob das Argument ein anderes "*" wäre, da ich keine Möglichkeit kenne, "**" als anzugeben ein einzelner Betreiber? Ist es überhaupt möglich, einen Operator als Argument zu übergeben?

Zusätzliche/Bonus-Bedingung wenn möglich (als ob ich nicht schon genug gesagt habe): Keine Makros !!!

+2

Es Betreiber Überlastung genannt wird, weil Sie Betreiber überlasten. ** ist kein Operator. – DeiDei

+1

Überladen Sie nicht den Operator^in der Bedeutung der Macht, es hat niedrigere Priorität als ==, + oder - so wird es viele Überraschungen verursachen. –

+0

@ ÖöTiib Toller Punkt! – mwm314

Antwort

4

Sie meinen so etwas?

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

Sehen Sie es hier leben http://coliru.stacked-crooked.com/a/ab56b9cd6e422e12

Erläuterung:

  1. Überlastung der unäre * Operator ein Proxy-Objekt
  2. Überlastung der binäre * Operator den Proxy zu verwenden ... Simple zurückzukehren :-)
  3. Ich habe eine Proxy-Klasse verwendet, um subtile Fehler zu vermeiden ..

C++ Spaß ... Ich möchte Sie tun dies für Spaß glauben und nicht in der Produktion ... Ursache sein eine sehr schlechte Idee, in der Produktion, rufen Sie einfach std::pow

+1

Nur weil etwas möglich ist, heißt das nicht, dass es eine gute Idee ist ... –

+2

Ja ... Ich weiß :-) ... Ich möchte glauben, dass das OP es zum Spaß machen will, nicht im Produktionscode – WhiZTiM

+0

Nur um klar und deutlich zu sein: Das kann ein lustiges kleines Spiel sein (und ich gebe offen zu, ich habe es selbst gemacht und es genossen), aber tue das nicht im Produktionscode oder irgendetwas anderes als nur Wegwerfcode, nur geschrieben, um das Spielen zu genießen. –

4

Kurze Antwort: Nein. Es gibt keine Möglichkeit, beliebige Zeichen/Token-Sequenzen in C++ zu "überladen".

Lange Antwort:a**b entspricht a * (*b), so dass Sie konnte Überlastung sowohl binäre * (das heißt mehrfach) und einstellige * (das heißt Dereference) in irgendeiner Art und Weise grob. Aber das wäre für jeden, der Ihren Code liest, völlig undurchsichtig und für das Debuggen/Pflegen in der Zukunft schmerzhaft.

Schreiben Sie einfach eine Funktion namens pow()!

+0

Das ist ein sehr schmutziger Trick. – mwm314

+0

Ich nehme an, dass es nicht möglich ist, einen Operator als Argument zu übergeben? – mwm314