Inhoudsopgave:
Video: BEFORE YOU GO TO SCHOOL, WATCH THIS || WHAT IS SCHOOL FOR? 2024
De standaardbibliotheek, gekoppeld aan de ingebouwde functies van C ++, bieden u een interessante reeks letterlijke tekens. De echte waarde van literals wordt echter duidelijker wanneer u uw eigen maakt.
Er zijn veel verschillende behoeften die u kunt oplossen met behulp van User Defined Literals (UDL's), maar drie gemeenschappelijke behoeften zijn het ondersteunen van gegevensconversies, het eenvoudiger maken van aangepaste typen om mee te werken en het verkrijgen van gewenste bijwerkingen zonder het gebruikelijke aantal coderingsproblemen.
Hoewel letterlijke of standaardbibliotheekliteralen zowel een voorvoegsel als een achtervoegsel bevatten, kunt u alleen het achtervoegselformulier maken bij het definiëren van uw eigen letterlijke waarden. Bovendien moet het achtervoegsel beginnen met een onderstrepingsteken. Het onderstrepingsteken dient om conflicten met bestaande achtervoegsels te voorkomen en om ervoor te zorgen dat andere ontwikkelaars weten dat het letterlijke een aangepaste (niet-standaard) vorm is.
Een conversie UDL ontwikkelen
Het is mogelijk om conversies in te kapselen in een UDL. Alles wat u hoeft te doen nadat u zo'n UDL hebt gemaakt, biedt het juiste achtervoegsel bij het definiëren van de constante om het gewenste resultaat te verkrijgen. Het CustomUDL01-voorbeeld toont een techniek voor het definiëren van een conversie die de straalinvoer verandert in het gebied van een cirkel in de constante.
# include namespace std; constexpr lange dubbele operator "_circ (lange dubbele straal) {retourradius * straal * 3. 141592;} int main () {double x = 5. 0_circ; cout <<" het gebied van de cirkel is: "<< x << endl; return 0;}
Voor het maken van de UDL is het voorbeeld gebaseerd op een constexpr met een retourwaarde van een lange dubbele en een invoerwaarde, radius, van een lange dubbele waarde. De vergelijking voor het berekenen van het gebied van een cirkel is πr 2 . Zoals u kunt zien, voert het voorbeeld de correcte berekening uit als onderdeel van de constexpr.
Telkens wanneer u een aangepaste UDL aanmaakt, zal de compiler dwingt je om het grootste type voor de conversie te gebruiken.wat dit betekent is dat je een lange dubbele voor literalen met een drijvende komma en niet-ondertekende lang moet gebruiken voor integer literals, zelfs als je later kiest om een kleiner type te gebruiken, zoals in deze bijvoorbeeld door x als een dubbel te declareren, moet de letterlijke zelf het grootst mogelijke type gebruiken.
Om een UDL van het nieuwe type te declareren, maakt het voorbeeld x, dat het achtervoegsel _circ gebruikt. s het resultaat op het scherm. Wanneer u dit voorbeeld uitvoert, ziet u dat de juiste waarde in x is geplaatst, zoals hier wordt weergegeven:
Het gebied van de cirkel is: 78. 5398
Een aangepast type UDL
ontwikkelen Veel van de code die u gebruikt ontmoeting is afhankelijk van aangepaste typen die moeilijk te volgen en te begrijpen zijn.Het maken van een UDL om de code te vereenvoudigen, maakt dingen duidelijker en vermindert de kans op fouten. Het CustomUDL02-voorbeeld toont een aangepast type, de operator die werd gebruikt om de UDL te maken, en ook hoe de UDL wordt gebruikt om een letterlijke definitie te geven.
# include namespace std; struct MyType {MyType (dubbele invoer): Waarde (invoer) {} dubbele waarde;}; MyType-operator "_mytype (lange dubbele waarde) {return MyType (Value);} int main () {auto UDLType = 145. 6_mytype; cout << uDLType. Waarde << endl; retourneer 0;}
Om dit te doen techniek om te werken, moet je een constructor voor je type maken die het aantal inputs accepteert dat vereist is om het type te configureren. Minstens, de constructor moet één type accepteren of de invoerwaarde die de gebruiker biedt is verloren.
De aangepaste type behoefte niet hetzelfde gegevenstype van de grootte ondersteunen als vereist door de operator, maar ze moeten van dezelfde soort zijn. U kunt bijvoorbeeld een lange double niet omzetten naar een int.
Wanneer u dit voorbeeld uitvoert, ziet u een uitvoer waarde van 145. 6, de waarde die u hebt ingevoerd voor het aangepaste type Het is mogelijk om met deze aanpak redelijk complexe instellingen te verwerken De gebruiker van uw aangepaste type verkrijgt de mogelijkheid om duidelijke code te maken die gemakkelijk te volgen en te interpreteren is, zelfs wanneer de onderliggende typen zijn complex.
Een aangepaste UDL gebruiken voor bijwerkingen
Een van de interessantste u ses voor UDL's is om bijwerkingen te creëren (een andere operatie dan de gebruikelijke of normale operatie, ofwel om de applicatie korter en efficiënter te maken of om extra flexibiliteit te bieden). U wilt een bepaald soort bewerking definiëren die plaatsvindt als resultaat van het definiëren van het letterlijke.
Wat u krijgt is nog steeds een letterlijke, maar een letterlijke waarde die niet noodzakelijk een waarde aangeeft die u later wilt gebruiken. Het voorbeeld van CustomUDL03 toont een dergelijk niet-traditioneel gebruik.
# include namespace std; void-operator "_countdown (unsigned long long Value) {for (int i = Value; i> = 0; i--) cout << i << endl;} int main () {10_countdown; return 0;}
U ziet dat de operator _countdown niet is gekoppeld aan iets dat u normaal aan een waarde zou koppelen. In feite wordt er helemaal geen waarde geretourneerd. In plaats daarvan krijgt u een bijwerking. zie deze uitvoer.
10 9 8 7 6 5 4 3 2 1 0
Wat er is gebeurd is dat de compiler 10_countdown heeft vervangen door individuele cout-statements, één voor elke iteratie van de lus. Wat je uiteindelijk oplevert is 11 cout-opdrachten die de waarden uitvoeren tussen 10 en 0 (in omgekeerde volgorde) De bijwerking UDL opent allerlei interessante mogelijkheden voor het maken van code die bepaalde repetitieve taken vereenvoudigt op een manier die het gebruik ervan duidelijk maakt.