2016-09-28 1 views
0

Ich versuche derzeit einige Code umzuformen, der einen primitiven Typ in etwas verwendet, das ich Setzer und Getter in sie stecken kann. Ich wollte die Änderung des zugrundeliegenden Codes transparent machen, und zuerst würde ich C++ 's Operator Overloads mir da draußen helfen.C++ generische rvalue Überladung

Nehmen wir an, ich möchte eine Art „int augmented“ machen, zum Beispiel, kann man erkennen, wie eine normale int behandelt werden, erlaubt aber für das weitere Vorgehen, wo immer ich es zuweisen und nur Zuordnung - alle anderen Eigenschaften eines int, wie das Hinzufügen mit +=, sollte beibehalten werden.

Zuerst habe ich zuerst aber, dass, wenn ich die int innerhalb einiger Struktur vergossen und ausgefüllte die operator= Überlastungen, würde ich eingestellt werden, wie im folgenden Beispiel:

#include<iostream> 

typedef struct PowerInt{ 
    int x; 

    PowerInt(){ 
    cout << "PowerInt created\n"; 
    x = 0; 
    } 
    ~PowerInt(){ 
    cout << "PowerInt destroyed\n"; 
    } 

    void operator=(int other){ 
    cout << "PowerInt received " << other << "\n"; 
    this->x = other; 
    } 
}PowerInt; 

int main(){ 
    PowerInt a; 
    a = 3; 
    return 0; 
} 

Der Code kompiliert und ausgeführt wie erwartet, aber sobald ich versuche, etwas anderes zu tun, das ein regulärer int tun könnte, wie cout << a, oder a += 2, oder sogar eine einfache int b = a; Zuweisung beschwert sich der Compiler über die Operatoren << und += fehlt.

Fair genug; Ich dann, dass, zumindest für << und "assigment =", könnte ich mit einer Art von "generischen Rvalue-Operator", oder eine Art von Methode, die PowerInt.x, wo meine a wird als ein rvalue, automatisch Ausdrücke wie int c = (a + 3); und if (a == 3) {} gültig.

Problem ist, ich kann keinen Weg finden, dieses Idiom zu implementieren, und dies hat wahrscheinlich entweder mit meinem kleinen Verständnis der Funktionsweise des Operators Überladen in C++ zu tun, oder mit einigen Sprachfunktionen, die mir noch nicht bekannt sind . Kann ich erreichen, was ich hier versuche?

+1

Ich sehe nicht die Beziehung zu [rvalue] (http://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues) –

+0

Es gibt einige unnötige C- isms hier –

+0

@LightnessRacesinOrbit Du könntest sie auf mich richten, da ich, nachdem ich fast ein Jahrzehnt in C programmiert habe, jetzt nur an C++ 's Oberfläche kratze, weißt du. :) – MVittiS

Antwort

0

Wenn Sie Ihren PowerInt wollen ein normales int sein umwandelbar Sie einen benutzerdefinierten Konvertierungsoperator erstellen:

operator int() const 
{ 
    return x; 
} 

Jeder Operator, der für PowerInt nicht definiert ist wird dann den Bediener für eine normale int definiert verwenden .

P. Die typedef struct ist in C++ nicht erforderlich.

+0

Dumme, dumme ich. Dies löst das Problem genau so, wie ich es beabsichtigt hatte. – MVittiS