Πίνακας περιεχομένων:
- Ανάπτυξη μετατροπής UDL
- Η ανάπτυξη ενός προσαρμοσμένου τύπου UDL
- Ένα από τα πιο ενδιαφέροντα u (UDL) είναι η δημιουργία
Βίντεο: Writing 2D Games in C using SDL by Thomas Lively 2024
Η Standard Library, σε συνδυασμό με τα ενσωματωμένα χαρακτηριστικά της C ++, σας παρέχουμε μια ενδιαφέρουσα σειρά λογοτύπων. Ωστόσο, η πραγματική αξία των κυριοτέρων γίνεται πιο εμφανής όταν δημιουργείτε τη δική σας.
Υπάρχουν πολλές διαφορετικές ανάγκες που μπορείτε να απευθυνθείτε χρησιμοποιώντας Χρήσιμα Ορισμένα Λέιζερ (UDL), αλλά τρεις κοινές ανάγκες υποστηρίζουν μετατροπές δεδομένων, διευκολύνοντας την εργασία των προσαρμοσμένων τύπων και αποκτώντας τις επιθυμητές παρενέργειες χωρίς τον συνήθη αριθμό κωδικών.
Παρόλο που τα ενσωματωμένα ή τα πρότυπα βιβλιογραφικά βιβλία προέρχονται τόσο από πρόθεμα όσο και από επίθεμα, μπορείτε μόνο να δημιουργήσετε τη μορφή κατάληξης όταν καθορίζετε τα δικά σας κείμενα. Επιπλέον, η κατάληξη πρέπει να ξεκινά με μια υπογράμμιση. Η υπογράμμιση συμβάλλει στην αποτροπή συγκρούσεων με υπάρχοντα επιθήματα και για να εξασφαλίσει ότι άλλοι προγραμματιστές γνωρίζουν ότι η λέξη είναι μια συνήθης (μη τυπική) μορφή.
Ανάπτυξη μετατροπής UDL
Είναι δυνατή η ενσωμάτωση μετατροπών σε ένα UDL. Το μόνο που χρειάζεται να κάνετε αφού δημιουργήσετε ένα τέτοιο UDL είναι να δώσετε την κατάλληλη κατάληξη όταν καθορίζετε τη σταθερά για να αποκτήσετε το αποτέλεσμα που θέλετε. Το παράδειγμα CustomUDL01 επιδεικνύει μια τεχνική για τον ορισμό μιας μετατροπής που αλλάζει την είσοδο της ακτίνας στην περιοχή ενός κύκλου στη σταθερά.
#include χρησιμοποιώντας namespace std; constexpr μακρύ διπλό χειριστή»_circ (μακρύ διπλό ακτίνα) {ακτίνα επιστροφή * ακτίνα * 3 141 592?.} int main () {διπλή x = 5. 0_circ? cout << "περιοχής του κύκλου είναι:" << x << endl ? επιστρέψει 0?}
προκειμένου να δημιουργήσει την UDL, το παράδειγμα βασίζεται σε ένα constexpr με μια τιμή επιστροφής από μια μακρά διπλή και μία τιμή εισόδου, ακτίνα, από μια μακρά διπλή η εξίσωση για τον υπολογισμό της περιοχής ενός κύκλου. είναι πr 2 όπως μπορείτε να δείτε, το παράδειγμα εκτελεί το σωστό υπολογισμό, στο πλαίσιο της constexpr
.. <--3 -!>Κάθε φορά που δημιουργείτε μια προσαρμοσμένη UDL, ο compiler σας υποχρεώνει να χρησιμοποιήσετε τον μεγαλύτερο τύπο για τη μετατροπή.Αυτό σημαίνει ότι πρέπει να χρησιμοποιήσετε ένα μακρύ διπλό για κυμαινόμενο σημείο literals και unsigned long long για ακέραια literals.Ακόμη και αν αργότερα επιλέγουν να χρησιμοποιήσουν ένα μικρότερο τύπο, όπως γίνεται σε αυτό για παράδειγμα δηλώνοντας το x ως διπλό, το ίδιο το γράμμα πρέπει να χρησιμοποιεί τον μεγαλύτερο δυνατό τύπο
Για να δηλώσει ένα UDL του νέου τύπου, το παράδειγμα δημιουργεί το x, το οποίο χρησιμοποιεί το επίθημα _circ. s το αποτέλεσμα στην οθόνη. Όταν εκτελείτε αυτό το παράδειγμα, θα δείτε ότι η σωστή τιμή έχει τοποθετηθεί στο x, όπως φαίνεται εδώ:
περιοχή του κύκλου είναι: 78. 5398
Η ανάπτυξη ενός προσαρμοσμένου τύπου UDL
Πολλοί τον κωδικό σας η συνάντηση βασίζεται σε ειδικούς τύπους που είναι δύσκολο να ακολουθηθούν και να κατανοηθούν.Η δημιουργία ενός UDL για απλούστευση του κώδικα καθιστά τα πράγματα πιο ξεκάθαρα και μειώνει τις πιθανότητες σφάλματος. Το παράδειγμα CustomUDL02 εμφανίζει έναν προσαρμοσμένο τύπο, ο χειριστής που χρησιμοποιήθηκε για τη δημιουργία του UDL, καθώς και τον τρόπο με τον οποίο χρησιμοποιείται το UDL για τον ορισμό ενός κυριολεκτικού.
#include χρησιμοποιώντας namespace std; struct MyType {MyType (διπλή είσοδος): Τιμή (Εισροή) {} διπλή τιμή?}; MyType operator "_mytype (μεγάλη διπλή τιμή) {επιστροφή MyType (τιμή);} int main () {auto UDLType = 145. 6_mytype; cout << uDLType. πρέπει να δημιουργήσετε έναν κατασκευαστή για τον τύπο που δέχεται τον αριθμό των εισόδων που απαιτούνται για τη διαμόρφωση του τύπου.Στο ελάχιστο, ο κατασκευαστής πρέπει να αποδεχθεί έναν τύπο ή την τιμή εισόδου που ο χρήστης παρέχει είναι χαμένος
. δεν υποστηρίζουν τον τύπο δεδομένων ίδιου μεγέθους όπως απαιτείται από τον χειριστή, αλλά πρέπει να είναι του ίδιου είδους.Για παράδειγμα, δεν θα μπορούσατε να μεταβάσετε ένα μεγάλο διπλό σε ένα int
Όταν εκτελείτε αυτό το παράδειγμα, βλέπετε μια έξοδο η αξία του 145. 6, η οποία είναι η τιμή που εισάγετε στον προσαρμοσμένο τύπο.Είναι δυνατό να χειριστείτε αρκετά πολύπλοκες ρυθμίσεις χρησιμοποιώντας αυτή την προσέγγιση.Ο χρήστης του προσαρμοσμένου σας τύπου αποκτά τη δυνατότητα να δημιουργήσει έναν σαφή κώδικα ο οποίος είναι εύκολος στην παρακολούθηση και ερμηνεία ακόμα και όταν οι υποκείμενοι τύποι είναι περίπλοκοι.
Χρήση ενός προσαρμοσμένου UDL για παρενέργειες
Ένα από τα πιο ενδιαφέροντα u (UDL) είναι η δημιουργία
παρενεργειών (μια λειτουργία διαφορετική από τη συνηθισμένη ή κανονική λειτουργία, είτε για να καταστήσει την εφαρμογή πιο σύντομη και αποτελεσματικότερη είτε για να προσφέρει πρόσθετη ευελιξία). Θέλετε να ορίσετε ένα συγκεκριμένο είδος πράξης που λαμβάνει χώρα ως αποτέλεσμα του ορισμού του κυριολεκτικού. Αυτό που παίρνετε είναι ακόμα κυριολεκτικό, αλλά κυριολεκτικό που δεν σημαίνει απαραίτητα μια αξία που σκοπεύετε να χρησιμοποιήσετε αργότερα. Το παράδειγμα CustomUDL03 δείχνει μια τέτοια μη παραδοσιακή χρήση.
#include χρησιμοποιώντας namespace std; () () (int (i =)) () () () () Παρατηρήστε ότι ο χειριστής _countdown δεν είναι συνημμένος σε κάτι που συνηθίζετε να συσχετίζετε με μια τιμή.Στην πραγματικότητα, δεν επιστρέφει μια τιμή καθόλου.Αυτό που παίρνετε αντ 'αυτού είναι μια παρενέργεια.Όταν τρέχετε αυτό το παράδειγμα, εσείς βλέπε αυτή την έξοδο
10 9 8 7 6 5 4 3 2 1 0
Αυτό που συνέβη είναι ότι ο μεταγλωττιστής έχει αντικαταστήσει το 10_countdown με ξεχωριστές δηλώσεις cout, ένα για κάθε επανάληψη του βρόχου. 11 παράμετροι cout που εκπέμπουν τις τιμές μεταξύ 10 και 0 (σε αντίστροφη σειρά) Το UDL παρενέργειας ανοίγει όλα τα είδη των ενδιαφέρουσες δυνατότητες για τη δημιουργία κώδικα που απλοποιεί ορισμένες επαναλαμβανόμενες εργασίες με τρόπο που καθιστά προφανή τη χρήση τους