C++ std:bármilyen példák

C Std Barmilyen Peldak



A C++ programozásban az „std::any” a Standard Template Library-ból (STL) egy dinamikus gépelést vezet be a heterogén adatok kezelésére. A hagyományos tárolókkal ellentétben az „std::any” lehetővé teszi bármilyen típusú érték tárolását egyetlen tárolón belül, növelve a rugalmasságot azokban a forgatókönyvekben, ahol az adattípusok ismeretlenek vagy futás közben változnak. Ez a típus-agnosztikus megközelítés olyan általános programozást támogat, amely felhatalmazza a fejlesztőket arra, hogy alkalmazkodóbb és kifejezőbb kódot hozzanak létre, miközben megőrzik a típusbiztonságot. Ebben a feltárásban elmélyülünk az „std::any” funkcióiban, használati mintáiban és gyakorlati példákban, amelyek bemutatják szerepét egy robusztus és rugalmas C++ kód írásában.

1. példa: A Std::Any alapvető használata

Először is vizsgáljunk meg egy egyszerű példát az „std::any” alapvető használatának bemutatására. Tekintsünk egy forgatókönyvet, ahol szükség van egy függvényre a különböző típusú paraméterek elfogadásához:







Íme a kódrészlet:



#include
#include

üres folyamat Bármilyen ( const std::any & érték ) {
ha ( érték.van_értéke ( ) ) {
std::cout << 'Tárolt érték típusa:' << érték tipusa ( ) .név ( ) << std::endl;

ha ( érték tipusa ( ) == typeid ( int ) ) {
std::cout << 'Érték:' << std::any_cast < int > ( érték ) << std::endl;
} más ha ( érték tipusa ( ) == typeid ( kettős ) ) {
std::cout << 'Érték:' << std::any_cast < kettős > ( érték ) << std::endl;
} más ha ( érték tipusa ( ) == typeid ( std::string ) ) {
std::cout << 'Érték:' << std::any_cast < std::string > ( érték ) << std::endl;
} más {
std::cout << 'Nem támogatott típus!' << std::endl;
}
} más {
std::cout << 'Nincs érték tárolva az std::any-ban.' << std::endl;
}
}

int fő ( ) {
feldolgozniBármilyen ( 42 ) ;
feldolgozniBármilyen ( 3.14 ) ;
feldolgozniBármilyen ( std::string ( 'Hello, std::any!' ) ) ;
feldolgozniBármilyen ( 4.5f ) ; // Nem támogatott típus

Visszatérés 0 ;
}


Ebben a példában definiáljuk a „processAny” függvényt, amely egy „std::any” hivatkozást vesz paraméterként, és megvizsgálja annak tartalmát. A függvényen belül először ellenőrizzük, hogy az „std::any” változónak van-e tárolt értéke a has_value() segítségével. Ha jelen van egy érték, akkor a type().name() segítségével meghatározzuk a tárolt érték típusát, és kinyomtatjuk a megfelelő értéket a típusa alapján. A fő függvény ezután bemutatja a „processAny” hasznosságát azáltal, hogy különböző típusokkal hívja: egész szám (42), dupla (3.14) és karakterlánc („Hello, std::any!”). A függvény megfelelően kezeli az egyes típusokat, és kiírja a megfelelő értékeket. Amikor azonban egy lebegőpontos számot (4.5f) próbál feldolgozni, amely ebben a példában nem támogatott, a program kecsesen kezeli a helyzetet, jelezve, hogy a típus nem támogatott.



A generált kimenet a következő:






Ez azt mutatja be, hogy az „std::any” hogyan teszi lehetővé a különféle adattípusok dinamikus kezelését, így sokoldalú eszköz az általános programozáshoz C++ nyelven.

2. példa: A felhasználó által meghatározott típusok tárolása

A második példa azt vizsgálja, hogy a Standard Template Library (STL) dinamikus típusa hogyan alkalmazkodik zökkenőmentesen az egyéni adatstruktúrákhoz. Egy felhasználó által definiált típusra, a pontstruktúrára összpontosítva bemutatjuk, hogy az „std::any” hogyan kezeli az ilyen struktúrák példányait.



Íme a kód:

#include
#include

osztály MyClass {
nyilvános:
Az osztályom ( int érték ) : adatok ( érték ) { }

érvénytelen printData ( ) const {
std::cout << 'Data in MyClass:' << adat << std::endl;
}

magán:
int adatok;
} ;

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

ha ( anyObject.has_value ( ) ) {
auto & myClassInstance = std::any_cast < Az osztályom &> ( bármelyObject ) ;
myClassInstance.printData ( ) ;
} más {
std::cout << 'Nincs érték tárolva az std::any-ban.' << std::endl;
}

Visszatérés 0 ;
}


Ebben a C++ kódrészletben egy egyszerű példát hozunk létre az „std::any” típus használatának szemléltetésére a „MyClass” nevű, felhasználó által definiált osztállyal. Az osztályon belül van egy „data” nevű privát tagváltozó és egy printData() nevű nyilvános metódus az adatok értékének megjelenítéséhez. Egy egész szám kerül átadásra és hozzárendelődik a konstruktor „data” tagjához.

A „main” függvényben példányosítunk egy „MyClass” objektumot 42-es kezdeti értékkel, majd eltároljuk az „anyObject” nevű „std::any” változóban. Ez azt mutatja, hogy az „std::any” képes tárolni a felhasználó által definiált osztályok példányait.

Ezt követően a has_value() metódus segítségével egy „if” utasítással ellenőrizzük, hogy az „anyObject”-nek van-e értéke. Ha van érték, akkor az „std::any_cast” segítségével lekérjük a tárolt objektumot. Az „std::any_cast” a „MyClass&” sablon argumentumával együtt kerül alkalmazásra, hogy a tárolt objektumot a „MyClass” hivatkozásra adja át. Ezt a hivatkozást, a „myClassInstance”-t használjuk a printData() metódus meghívására, bemutatva az „std::any”-on belüli tárolt, felhasználó által definiált típus elérésének és működésének képességét.

Ha nem tárolunk értéket az „std::any”-ban, akkor ezt jelző üzenetet nyomtatunk. Ez a feltételes ellenőrzés biztosítja, hogy kezeljük azokat a forgatókönyveket, ahol az „std::any” változó üres lehet.

Íme a kimenet:

3. példa: Vegyes típusú konténer

A programozásban a „vegyes típusú konténer” olyan adatstruktúrát jelent, amely képes különféle, potenciálisan nem kapcsolódó adattípusok elemeit tárolni. Ez a rugalmasság értékes olyan forgatókönyvek kezelésekor, ahol az adattípusok ismeretlenek a fordítási időben, vagy dinamikusan változnak a program végrehajtása során. A C++ nyelvben az „std::any” példázza ezt a koncepciót, amely lehetővé teszi egyetlen tároló létrehozását a különböző típusú értékek tárolására.

Tekintsünk meg egy forgatókönyvet, amelyben létrehozunk egy tárolót, amely különféle típusokat tartalmaz:

#include
#include
#include

int fő ( ) {

std::vektor < std::any > mixContainer;

mixContainer.push_back ( 42 ) ;
mixContainer.push_back ( 3.14 ) ;
mixContainer.push_back ( std::string ( 'Helló' ) ) ;
mixContainer.push_back ( igaz ) ;

számára ( const auto & elem : mixContainer ) {
ha ( elem.típus ( ) == typeid ( int ) ) {
std::cout << 'Integer:' << std::any_cast < int > ( elem ) << std::endl;
} más ha ( elem.típus ( ) == typeid ( kettős ) ) {
std::cout << 'Dupla:' << std::any_cast < kettős > ( elem ) << std::endl;
} más ha ( elem.típus ( ) == typeid ( std::string ) ) {
std::cout << 'Húr: ' << std::any_cast < std::string > ( elem ) << std::endl;
} más ha ( elem.típus ( ) == typeid ( bool ) ) {
std::cout << 'Boolean:' << std::any_cast < bool > ( elem ) << std::endl;
} más {
std::cout << 'Ismeretlen típus' << std::endl;
}
}

Visszatérés 0 ;
}


Ezen az ábrán bemutatjuk a vegyes típusú konténer fogalmát a C++ és az „std::any” funkció használatával. Létrehozzuk a „mixedContainer” nevű „std::vector”-t, amely tárolóként szolgál a különböző adattípusok elemeinek tárolására. A „push_back” függvény segítségével feltöltjük ezt a tárolót különböző elemekkel, beleértve egy egész számot (42), egy dupla (3.14), egy karakterláncot ('Hello') és egy logikai értéket (true).

Miközben a „mixedContainer”-en iterálunk egy „for” ciklus használatával, a type() függvényt használjuk az egyes elemek adattípusának dinamikus azonosítására. Az „std::any_cast” használatával kivonjuk és kinyomtatjuk a megfelelő értékeket azok típusa alapján. Például, ha az elem „int” típusú, akkor egész számként nyomtatjuk ki. Ha „dupla” típusú, akkor duplaként nyomtatjuk, és így tovább.

Íme a generált kimenet:

4. példa: Hibakezelés a Std::Any használatával

Az „std::any” használatakor fellépő hibák kezelése magában foglalja annak ellenőrzését, hogy a típus támogatott-e, vagy tárolva van-e egy érték. Ebben a példában bemutatjuk, hogyan kell kezelni a nem támogatott típusokat:

#include
#include

int fő ( ) {
std::any myAny = 42 ;

próbáld ki {

double value = std::any_cast < kettős > ( myAny ) ;
std::cout << 'Érték:' << érték << std::endl;
} fogás ( const std::bad_any_cast & Ez ) {

std::cerr << 'Hiba:' << e.mit ( ) << std::endl;
}

Visszatérés 0 ;
}


Kezdjük az „std::any” változó, a „myAny” inicializálásával a 42 egész típusú értékkel. A következő „try” blokkon belül explicit kísérletet teszünk arra, hogy ezt az egész értéket „double”-ba öntsük az „std::any_cast” művelettel. Mivel azonban a „myAny”-ban tárolt tényleges típus egy egész szám, ez az öntési művelet érvénytelen „dupla” esetén, ami nem egyező típushoz vezet.

A lehetséges hiba kecses kezelése érdekében a kivételkezelést egy „catch” blokkal valósítjuk meg, amely az „std::bad_any_cast” konkrét kivételtípus megfogására szolgál. Sikertelen leadás esetén a „catch” blokk aktiválódik, és hibaüzenetet generálunk az „std::cerr” használatával, hogy közöljük a hiba természetét. Ez a hibakezelési stratégia biztosítja, hogy programunk kecsesen tudja kezelni azokat a helyzeteket, amikor a megkísérelt típusátküldés ütközik az „std::any” változóban tárolt tényleges típussal.

Következtetés

Ebben a cikkben az „std::any” alkalmazásait vizsgáltuk meg a C++ nyelven, egy dinamikus típusú konténerben, amelyet a C++ nyelven különféle típusú értékekhez vezetnek be. Sokoldalúságát különféle példákon keresztül demonstráltuk, bemutatva az alapvető használattól a felhasználó által meghatározott típusok és heterogén gyűjtemények kezeléséig terjedő forgatókönyveket. Bemutattuk gyakorlati alkalmazását olyan forgatókönyvekben, ahol az adatok típusa a fordításkor nem ismert. Ezen túlmenően a hibakezelési technikákkal is foglalkoztunk, hangsúlyozva a nem támogatott típusok kecses kezelésének fontosságát a kivételkezelésen keresztül.