Erstellen Sie Ihre eigene UDLs in C ++

Die Standard-Bibliothek, in Verbindung mit den integrierten Funktionen von C ++, bieten Ihnen eine interessante Auswahl von Literalen. Allerdings wird der wahre Wert von Literalen offensichtlicher, wenn Sie Ihre eigene Gruppe gründen.

Es gibt viele verschiedene Bedürfnisse Sie benutzerdefinierte Literale (UDLs), aber drei gemeinsame Bedürfnisse unterstützen Datenkonvertierungen mit adressieren kann, benutzerdefinierte Typen einfacher machen, mit zu arbeiten, und ohne die übliche Anzahl von Codierungs Probleme gewünschten Nebenwirkungen zu erhalten.

Obwohl eingebaute oder Literale Standard Library kommen sowohl Präfix und Suffix Form, können Sie nur das Suffix Formular erstellen, wenn Sie Ihre eigenen Literale definieren. Darüber hinaus muss das Suffix mit einem Unterstrich beginnen. Der Unterstrich dient mit bestehenden Suffixe verhindern Konflikte zu helfen, und andere Entwickler, um sicherzustellen, dass die wörtliche ist ein Brauch (Nicht-Standard) Form.

Die Entwicklung einer Umwandlung UDL

Es ist möglich, Umwandlungen innerhalb einer UDL zu verkapseln. Alles, was Sie tun müssen, wenn Sie schaffen so ein UDL ist das entsprechende Suffix liefern, wenn die Konstante definiert, das gewünschte Ergebnis zu erhalten. Das CustomUDL01 Beispiel veranschaulicht eine Technik zum Definieren einer Umwandlung, die den Radius Eingabe in die Fläche eines Kreises in den ständigen Veränderungen.

#einschließen using namespace std-constexpr long double Operator "" _circ (long double radius) {return Radius * Radius * 3.141592-} int main () {double x = 5.0_circ-cout lt; lt; "Das Gebiet der Kreis ist:" lt; lt; x lt; lt; Endl-return 0-}

Um die UDL zu schaffen, stützt sich das Beispiel auf ein constexpr mit einem Rückgabewert von a long double und ein Eingabewert, Radius, von a long double. Die Gleichung zur Berechnung der Fläche eines Kreises ist, # 960-r2. Wie Sie sehen können, führt das Beispiel die korrekte Berechnung im Rahmen der constexpr.

Jedes Mal, wenn Sie eine benutzerdefinierte UDL erstellen, werden die Compiler zwingt Sie dazu den größten Typ für die Konvertierung zu verwenden. Was dies bedeutet, ist, dass Sie ein verwenden müssen long double für Gleitkomma-Literale und unsigned long long für Ganzzahlliterale. Auch wenn Sie später einen kleineren Typ verwenden möchten, wie in diesem Beispiel geschehen, indem er erklärt x als ein doppelt, die wörtliche selbst muss die größtmögliche Art beschäftigen.

Um eine UDL des neuen Typs deklarieren, das Beispiel erstellt x, was nutzt die _circ Suffix. Es gibt dann das Ergebnis am Bildschirm. Wenn Sie dieses Beispiel ausführen, sehen Sie, dass der richtige Wert gelegt wurde x, wie hier gezeigt:

Das Gebiet der Kreis ist: 78,5398

Die Entwicklung eines benutzerdefinierten Typ UDL

Ein großer Teil der Code, den Sie verlässt sich auf benutzerdefinierte Typen begegnen, die schwer zu folgen und zu verstehen. eine UDL Erstellen Sie den Code zu vereinfachen, macht die Dinge klarer und reduziert das Potenzial für Fehler. Das CustomUDL02 Beispiel zeigt einen benutzerdefinierten Typ, der Betreiber verwendet, um die UDL zu schaffen, als auch, wie die UDL eine wörtliche zu definieren, verwendet wird.

#einschließen using namespace std-Strukt MyType {MyType (double Input): Wert (Input) {} double-Wert -} - MyType Operator "" _mytype (long double Value) {return MyType (Value) -} int main () {auto UDLType = 145.6_mytype-cout lt; lt; UDLType.Value lt; lt; Endl-return 0-}

Damit diese Technik funktioniert, müssen Sie einen Konstruktor für Ihre Art erstellen, die die Anzahl der erforderlichen Eingaben akzeptiert, den Typ zu konfigurieren. Es muss zumindest der Konstruktor eine Art oder den Eingangswert akzeptieren wird der Benutzer verloren bietet.

Die benutzerdefinierten Typ muss nicht die gleiche Größe Datentyp unterstützen, wie durch den Bediener erforderlich, aber sie müssen von der gleichen Art sein. Zum Beispiel könnten Sie eine nicht über long double zu einem int.

Wenn Sie dieses Beispiel ausführen, sehen Sie einen Ausgangswert von 145,6, die der von Ihnen eingegebene Wert der benutzerdefinierten Typ ist. Es ist möglich, ziemlich komplexe Konfigurationen mit diesem Ansatz zu behandeln. Der Benutzer des benutzerdefinierten Typ erhält die Fähigkeit, freien Code zu erstellen, der einfach zu folgen und zu interpretieren, auch wenn die zugrunde liegenden Typen sind komplex.

Verwenden einer benutzerdefinierten UDL für Nebenwirkungen

Eine der interessantesten Anwendungen für UDLs ist die Schaffung Nebeneffekte (Eine Operation, andere als die üblichen oder normalen Betrieb, entweder machen die Anwendung für kürzere und effizientere oder zusätzlichen Flexibilität zur Verfügung zu stellen). Sie wollen eine bestimmte Art von Operation zu definieren, die als Ergebnis der Definition des wörtlichen nimmt.

Was man bekommt, ist immer noch eine wörtliche, aber eine wörtliche, die nicht unbedingt einen Wert bezeichnen, die Sie später verwenden möchten. Das CustomUDL03 Beispiel zeigt eine solche nicht-traditionellen Gebrauch.

#einschließen using namespace std-Operator void "" _countdown (unsigned long long-Wert) {for (int i = Value- i> = 0- i -) cout lt; lt; ich lt; lt; endl-} int main () {10_countdown-return 0-}

Beachten Sie, dass die _Countdown Betreiber ist nicht auf etwas angebracht, die man normalerweise mit einem Wert in Verbindung bringt. In der Tat ist es nicht Wert überhaupt zurück. Was Sie bekommen stattdessen ist ein Nebeneffekt. Wenn Sie dieses Beispiel ausführen, sehen Sie diese Ausgabe.

109876543210

Was geschehen ist, ist, dass der Compiler ersetzt 10_countdown mit individuellen cout Anweisungen, eine für jede Iteration der Schleife. Was Sie am Ende mit 11 cout Aussagen, dass die Ausgabe die Werte zwischen 10 und 0 (in umgekehrter Reihenfolge). Der Nebeneffekt UDL eröffnet eine Vielzahl von interessanten Möglichkeiten für die Code-Erstellung, die bestimmte sich wiederholende Aufgaben in einer Art und Weise vereinfacht, die ihre Verwendung offensichtlich macht.

Menü