Definieren Sie den Operator ** in C ++

8

Wie kann ich den Operator ** so definieren, dass er 2 Zahlen potenzieren kann? zB 2 ** 3 . Es sollte als Antwort 8 geben.

Oder gibt es indirekt eine Möglichkeit, dies mit Operatorüberladung statt #define Makros zu machen?

    
poorva 28.10.2013, 10:11
quelle

7 Antworten

18

Sie können nicht. Sie können nur vorhandene Operatoren überladen und nicht für eingebaute Typen.

    
StoryTeller 28.10.2013 10:13
quelle
8

Sie können nicht. Sie können nur bestehende Operatoren in C ++ überladen; Sie können keine neuen hinzufügen oder die Arität oder Assoziativität bestehender Operatoren ändern. Auch der Präprozessor ist hier machtlos - seine Bezeichner können keine Symbole sein.

    
Angew 28.10.2013 10:13
quelle
5

Wenn Sie bereit sind, einen Kompromiss zu machen, w.r.t. ** und habe das Gefühl, deinen Code zu verschleiern:

%Vor%

Ansonsten verwenden Sie einfach std::pow .

    
jrok 28.10.2013 10:25
quelle
5

Wie bei den anderen Antworten bereits erwähnt, ist dies für integrierte Typen nicht möglich. ABER Sie können dies für benutzerdefinierte Typen wie diesen verwenden (minimales Codebeispiel):

%Vor%

Live-Beispiel

    
user1233963 28.10.2013 11:33
quelle
3

Wie andere angemerkt haben: das ist nicht möglich. Sie können einen anderen Operator, wie ^ , für die Potenzierung überladen, stattdessen jedoch für einen einfachen Typ Wrapper-Klasse / Objekt.

Aber, wenn Sie abenteuerlustig sind, ein anderer Weg, ist, ein Mikro-DSL zu schaffen, das die sofortige Berechnung eines solchen Betreibers unterstützt. Ein berühmtes Beispiel dafür ist LISP in C ++ >

Angesichts des Aufwands, der damit verbunden ist, kann es aber auch nicht dein Ding sein. Es ist jedoch zu wissen, dass eine solche Möglichkeit besteht.

UPDATE:

Operator-Overloading funktioniert, indem bereits vorhandene Operatoren überladen werden. Warum? Denn wenn Sie Ihre eigenen definieren können, müssen Sie auch den Vorrang solcher Operatoren definieren, die leicht dem Missbrauch von Operatoren ausweichen können, indem sie ihren ursprünglichen Zweck abstrahieren - was die Schwierigkeit beim Lesen von Code erhöht. (Zumindest ist das das Argument, das gemacht wurde).

Der nächstgelegene Operator mit einer semantischen Bedeutung nahe ** ist der Caret-Operator. Eine naive und illustrative Implementierung eines solchen Operators ist:

%Vor%     
jrd1 28.10.2013 10:18
quelle
0

Leider ist die Menge der Operatoren, die in C ++ überladen werden kann, behoben und enthält nicht den Operator **. Sie könnten stattdessen operator^() verwenden, aber es stellt sich heraus, dass ^ die falsche Priorität hat, um als Potenzoperator zu dienen.

Kurz gesagt, es gibt leider nicht viel, was Sie dagegen tun können.

    
Drew Hall 28.10.2013 10:16
quelle
0

Sie können Operatoren für integrierte Typen nicht überladen. Ich würde operator ^ für diesen Zweck für benutzerdefinierte Typen verwenden.

    
Ivan Grynko 28.10.2013 10:15
quelle