Cuprins:
- Dezvoltarea unei conversii UDL
- Aria cercului este: 78. 5398
- Unul dintre cele mai interesante pentru UDL-uri este crearea de
Video: 8 Modul 3 Crearea propriilor sabloane 2024
Biblioteca standard, împreună cu funcțiile încorporate din C ++, vă oferă o gamă interesantă de literali. Cu toate acestea, adevărata valoare a literalurilor devine mai evidentă atunci când creați-vă propriile.
Există numeroase nevoi diferite pe care le puteți adresa utilizând literali definite de utilizator (UDL), dar trei necesități comune sunt suportul conversiilor de date, facilitarea lucrului cu tipurile personalizate și obținerea efectelor secundare dorite fără numărul obișnuit de probleme de codare.
Deși literalurile bibliotecilor standard sau bibliotecilor standard se găsesc atât în formă prefixă cât și în sufix, puteți crea doar forma sufixului când definiți propriile literali. În plus, sufixul trebuie să înceapă cu un subliniere. Sublinierea servește pentru a preveni conflictele cu sufixele existente și pentru a se asigura că alți dezvoltatori știu că literalul este o formă personalizată (nonstandard).
Dezvoltarea unei conversii UDL
Este posibilă încapsularea conversiilor într-un UDL. Tot ce trebuie să faceți după crearea unei astfel de UDL este să furnizați sufixul corespunzător când definiți constanta pentru a obține rezultatul dorit. Exemplul CustomUDL01 demonstrează o tehnică pentru definirea unei conversii care modifică intrarea razei în zona unui cerc în constanță.
# include utilizarea namespace std; contexpr lung operator dublu "_circ (raza lunga dubla) {raza de retur * raza * 3 141592;} int main () {double x = 5. 0_circ; cout <<" zona cercului este: "<< x << endl; return 0;}
Pentru a crea UDL, exemplul se bazeaza pe un constexpr cu o valoare de returnare a unei lungi duble si a unei valori de intrare, raza, a unui dublu lung.Ecuatia pentru calculul ariei cercului 2
După cum puteți vedea, exemplul realizează calculul corect ca parte a contextualizării
vă obligă să utilizați cel mai mare tip de conversie.Acest lucru înseamnă că trebuie să utilizați un dublu lung pentru literele cu virgulă mobilă și lungimea nesemnată lungă pentru literali întregi Chiar dacă mai târziu alegeți să utilizați un tip mai mic, de exemplu prin declararea lui x drept dublu, literalul însăși trebuie să utilizeze cel mai mare tip posibil
Pentru a declara un UDL de tip nou, exemplul creează x, care utilizează sufixul _circ. rezultatul pe ecran. Când executați acest exemplu, veți vedea că valoarea corectă a fost plasată în x, după cum se arată aici:
Aria cercului este: 78. 5398
Dezvoltarea unui tip personalizat UDL
O mulțime de cod întâlnirea se bazează pe tipuri personalizate care sunt greu de urmărit și de înțeles.Crearea unui UDL pentru a simplifica codul face lucrurile mai clare și reduce potențialul de eroare. Exemplul CustomUDL02 arată un tip personalizat, operatorul folosit pentru a crea UDL, precum și modul în care UDL este utilizat pentru a defini literal.
# include utilizarea namespace std; struct MyType {MyType (intrare dublă): Value (Input) {} valoare dublă;}; MyType operator "_mytype (valoare dublă lungă) {retur MyType (Value);} int main () {auto UDLType = 145. 6_mytype; cout << uDLType Valoare << endl; return 0; pentru a lucra, trebuie să creați un constructor pentru tipul dvs. care acceptă numărul de intrări necesare pentru configurarea tipului.Prin minim, constructorul trebuie să accepte un tip sau valoarea de intrare pe care utilizatorul o oferă este pierdută. nu suportă același tip de date de dimensiune conform cerințelor operatorului, dar ele trebuie să fie de același tip.De exemplu, nu ați putut trece un dublu lung la un int.
Când executați acest exemplu, vedeți o ieșire valoare de 145. 6, care este valoarea pe care o introduceți pentru tipul personalizat.Este posibil să se ocupe de configurații destul de complexe folosind această abordare.Utilizatorul de tip personalizat obține capacitatea de a crea un cod clar care este ușor de urmărit și interpretat, tipurile subiacente sunt complexe.
Utilizarea unui UDL personalizat pentru efecte secundare
Unul dintre cele mai interesante pentru UDL-uri este crearea de
efecte secundare (o operațiune diferită de operarea obișnuită sau normală, fie pentru a face aplicația mai scurtă și mai eficientă, fie pentru a oferi o flexibilitate suplimentară). Vrei să definiți un anumit tip de operație care are loc ca urmare a definirii literalului. Ceea ce obțineți este încă un literal, dar un literal care nu înseamnă neapărat o valoare pe care intenționați să o utilizați mai târziu. Exemplul CustomUDL03 arată o astfel de utilizare netradițională.
# include utilizarea namespace std; void operator "_countdown (valoare lungă nesemnată lungă) {for (int i = value; i> = 0; i--) cout << i << endl; Observați că operatorul _countdown nu este atașat la ceva pe care l-ați asocia în mod normal cu o valoare.De fapt, acesta nu întoarce o valoare deloc.Acest lucru este, în schimb, un efect secundar.Atunci când executați acest exemplu, a se vedea această ieșire
10 9 8 7 6 5 4 3 2 1 0
Ce sa întâmplat este că compilatorul a înlocuit 10_countdown cu instrucțiuni cout individuale, câte unul pentru fiecare iterație a buclă. 11 declarații de tip cout care trimit valori între 10 și 0 (în ordine inversă) Efectul secundar UDL deschide tot felul de posibilități interesante pentru crearea unui cod care simplifică anumite sarcini repetitive într-o manieră care face ca utilizarea lor să devină evidentă