C++ std: alle eksempler

C Std Alle Eksempler



I C++ programmering introducerer 'std::any' fra Standard Template Library (STL) en dynamisk indtastning til at håndtere heterogene data. I modsætning til traditionelle containere tillader 'std::any' lagring af værdier af enhver type i en enkelt container, hvilket øger fleksibiliteten i scenarier, hvor datatyperne er ukendte eller varierer under kørsel. Denne typeagnostiske tilgang fremmer en generisk programmering, som giver udviklerne mulighed for at skabe en mere tilpasningsdygtig og udtryksfuld kode, samtidig med at typesikkerheden bibeholdes. I denne udforskning vil vi dykke ned i funktionerne i 'std::any', dets brugsmønstre og praktiske eksempler, der illustrerer dets rolle i at skrive en robust og fleksibel C++ kode.

Eksempel 1: Grundlæggende brug af Std::Any

Lad os først udforske et ligetil eksempel for at demonstrere den grundlæggende brug af 'std::any'. Overvej et scenario, hvor du har brug for en funktion til at acceptere forskellige typer parametre:







Her er kodestykket:



#include
#inkluder

ugyldig procesEnhver ( const std::any & værdi ) {
hvis ( værdi.har_værdi ( ) ) {
std::cout << 'Type gemt værdi: ' << værdi.type ( ) .navn ( ) << std::endl;

hvis ( værdi.type ( ) == typeid ( int ) ) {
std::cout << 'Værdi:' << std::any_cast < int > ( værdi ) << std::endl;
} andet hvis ( værdi.type ( ) == typeid ( dobbelt ) ) {
std::cout << 'Værdi:' << std::any_cast < dobbelt > ( værdi ) << std::endl;
} andet hvis ( værdi.type ( ) == typeid ( std::streng ) ) {
std::cout << 'Værdi:' << std::any_cast < std::streng > ( værdi ) << std::endl;
} andet {
std::cout << 'Ikke-understøttet type!' << std::endl;
}
} andet {
std::cout << 'Ingen værdi gemt i std::any.' << std::endl;
}
}

int main ( ) {
behandle enhver ( 42 ) ;
behandle enhver ( 3.14 ) ;
behandle enhver ( std::streng ( 'Hej std::any!' ) ) ;
behandle enhver ( 4,5f ) ; // Ikke understøttet type

Vend tilbage 0 ;
}


I dette eksempel definerer vi funktionen 'procesAny', der tager en 'std::any' reference som en parameter og undersøger dens indhold. Inde i funktionen tjekker vi først, om 'std::any'-variablen har en lagret værdi ved hjælp af has_value(). Hvis en værdi er til stede, bestemmer vi typen af ​​den lagrede værdi ved hjælp af type().name() og fortsætter med at udskrive den tilsvarende værdi baseret på dens type. Hovedfunktionen demonstrerer derefter nytten af ​​'procesAny' ved at kalde den med forskellige typer: et heltal (42), en dobbelt (3.14) og en streng ('Hej, std::any!'). Funktionen håndterer hver type passende og udskriver de respektive værdier. Men når man forsøger at behandle et flydende kommatal (4.5f), som ikke understøttes i dette eksempel, håndterer programmet elegant situationen ved at indikere, at typen ikke understøttes.



Det genererede output er:






Dette viser, hvordan 'std::any' muliggør dynamisk håndtering af forskellige datatyper, hvilket gør det til et alsidigt værktøj til generisk programmering i C++.

Eksempel 2: Lagring af de brugerdefinerede typer

Det andet eksempel undersøger, hvordan denne dynamiske type i Standard Template Library (STL) problemfrit rummer de tilpassede datastrukturer. Med fokus på en brugerdefineret type, punktstrukturen, viser vi, hvordan 'std::any' håndterer forekomster af sådanne strukturer.



Her er koden:

#include
#inkluder

klasse MyClass {
offentlig:
Min klasse ( int værdi ) : data ( værdi ) { }

ugyldig printData ( ) konst {
std::cout << 'Data i MyClass: ' << data << std::endl;
}

privat:
int data;
} ;

int main ( ) {
std::any anyObject = MyClass ( 42 ) ;

hvis ( anyObject.has_value ( ) ) {
auto & myClassInstance = std::any_cast < Min klasse &> ( ethvert objekt ) ;
myClassInstance.printData ( ) ;
} andet {
std::cout << 'Ingen værdi gemt i std::any.' << std::endl;
}

Vend tilbage 0 ;
}


I dette C++ kodestykke opretter vi et simpelt eksempel til illustration ved hjælp af typen 'std::any' med en brugerdefineret klasse kaldet 'MyClass'. Inden for klassen er der en privat medlemsvariabel kaldet 'data' og en offentlig metode kaldet printData() til at vise værdien af ​​disse data. En heltalsværdi sendes og tildeles til 'data'-medlemmet i konstruktøren.

I 'hoved'-funktionen instansierer vi et objekt af 'MyClass' med en startværdi på 42 og gemmer det derefter i 'std::any'-variablen med navnet 'anyObject'. Dette demonstrerer evnen til 'std::any' til at holde forekomster af brugerdefinerede klasser.

Efter dette bruger vi en 'if'-sætning til at kontrollere, om 'anyObject' har en værdi ved hjælp af has_value()-metoden. Hvis der er en værdi, henter vi det lagrede objekt ved hjælp af 'std::any_cast'. 'std::any_cast' bruges sammen med 'MyClass&' skabelonargumentet til at caste det lagrede objekt til en reference af 'MyClass'. Denne reference, 'myClassInstance', bruges derefter til at kalde printData()-metoden, der viser muligheden for at få adgang til og operere på den lagrede brugerdefinerede type i 'std::any'.

Hvis der ikke er gemt nogen værdi i 'std::any', udskriver vi en meddelelse, der angiver dette. Denne betingede kontrol sikrer, at vi håndterer de scenarier, hvor 'std::any'-variablen kan være tom.

Her er outputtet:

Eksempel 3: Beholder af blandede typer

I programmering refererer en 'mixed-type container' til en datastruktur, der er i stand til at indeholde elementerne i forskellige, potentielt ikke-relaterede datatyper. Denne fleksibilitet er værdifuld, når man håndterer scenarier, hvor datatyperne er ukendte på kompileringstidspunktet eller dynamisk ændres under programafvikling. I C++ eksemplificerer 'std::any' dette koncept, der tillader oprettelsen af ​​en enkelt container til at gemme værdierne af forskellige typer.

Lad os udforske et scenarie, hvor vi opretter en container, der rummer forskellige typer:

#include
#inkluder
#inkluder

int main ( ) {

std::vektor < std::enhver > blandetContainer;

mixedContainer.push_back ( 42 ) ;
mixedContainer.push_back ( 3.14 ) ;
mixedContainer.push_back ( std::streng ( 'Hej' ) ) ;
mixedContainer.push_back ( rigtigt ) ;

til ( const auto & element: mixedContainer ) {
hvis ( element.type ( ) == typeid ( int ) ) {
std::cout << 'Heltal: ' << std::any_cast < int > ( element ) << std::endl;
} andet hvis ( element.type ( ) == typeid ( dobbelt ) ) {
std::cout << 'Dobbelt: ' << std::any_cast < dobbelt > ( element ) << std::endl;
} andet hvis ( element.type ( ) == typeid ( std::streng ) ) {
std::cout << 'String: ' << std::any_cast < std::streng > ( element ) << std::endl;
} andet hvis ( element.type ( ) == typeid ( bool ) ) {
std::cout << 'Boolsk: ' << std::any_cast < bool > ( element ) << std::endl;
} andet {
std::cout << 'Ukendt type' << std::endl;
}
}

Vend tilbage 0 ;
}


I denne illustration demonstrerer vi konceptet med en blandet type container ved hjælp af C++ og funktionen 'std::any'. Vi opretter 'std::vector' med navnet 'mixedContainer' for at fungere som vores container til at indeholde elementerne i forskellige datatyper. Ved at bruge funktionen 'push_back' udfylder vi denne beholder med forskellige elementer, herunder et heltal (42), en dobbelt (3.14), en streng ('Hej') og en Boolean (sand).

Når vi itererer gennem 'mixedContainer' ved hjælp af en 'for'-løkke, bruger vi type()-funktionen til at identificere hvert elements datatype dynamisk. Ved at bruge 'std::any_cast', udtrækker og udskriver vi de tilsvarende værdier baseret på deres typer. For eksempel, hvis elementet er af typen 'int', udskriver vi det som et heltal. Hvis det er af typen 'dobbelt', udskriver vi det som et dobbelt, og så videre.

Her er det genererede output:

Eksempel 4: Fejlhåndtering med Std::Any

Håndtering af fejl ved brug af 'std::any' involverer at kontrollere, om typen er understøttet, eller om en værdi er gemt. I dette eksempel viser vi, hvordan man håndterer de ikke-understøttede typer:

#include
#inkluder

int main ( ) {
std::any myAny = 42 ;

prøve {

dobbelt værdi = std::any_cast < dobbelt > ( min Enhver ) ;
std::cout << 'Værdi:' << værdi << std::endl;
} fangst ( const std::bad_any_cast & det er ) {

std::cerr << 'Fejl: ' << e. hvad ( ) << std::endl;
}

Vend tilbage 0 ;
}


Vi starter med at initialisere 'std::any'-variablen, 'myAny', med værdien 42 af heltalstypen. Inde i den efterfølgende 'try'-blok gør vi et eksplicit forsøg på at caste denne heltalsværdi til en 'double' ved hjælp af 'std::any_cast'-operationen. Men da den faktiske type, der er gemt i 'myAny', er et heltal, er denne casting-operation ugyldig for en 'double', hvilket fører til en mismatch-type.

For at håndtere denne potentielle fejl elegant implementerer vi undtagelseshåndteringen med en 'catch'-blok, der er designet til at fange den specifikke undtagelsestype 'std::bad_any_cast'. I tilfælde af et mislykket cast aktiveres 'catch'-blokken, og vi genererer en fejlmeddelelse ved hjælp af 'std::cerr' for at kommunikere fejlens art. Denne fejlhåndteringsstrategi sikrer, at vores program elegant kan håndtere de situationer, hvor den forsøgte typecast kolliderer med den faktiske type, der er gemt i 'std::any'-variablen.

Konklusion

I denne artikel undersøgte vi anvendelserne af 'std::any' i C++, en dynamisk typebeholder, der introduceres i C++ for værdier af forskellige typer. Vi demonstrerede dens alsidighed gennem forskellige eksempler og viste scenarier, der spænder fra grundlæggende brug til håndtering af de brugerdefinerede typer og heterogene samlinger. Vi demonstrerede dens praktiske anvendelse i scenarier, hvor typen af ​​data ikke er kendt på kompileringstidspunktet. Derudover udforskede vi fejlhåndteringsteknikkerne og understregede vigtigheden af ​​elegant håndtering af de ikke-understøttede typer gennem undtagelseshåndtering.