C++ std:akékoľvek príklady

C Std Akekolvek Priklady



V programovaní C++ „std::any“ z knižnice štandardných šablón (STL) zavádza dynamické písanie na spracovanie heterogénnych údajov. Na rozdiel od tradičných kontajnerov „std::any“ umožňuje ukladanie hodnôt akéhokoľvek typu v rámci jedného kontajnera, čím sa zvyšuje flexibilita v scenároch, kde sú dátové typy neznáme alebo sa menia počas behu. Tento typovo agnostický prístup podporuje všeobecné programovanie, ktoré umožňuje vývojárom vytvárať prispôsobivejší a expresívnejší kód pri zachovaní typovej bezpečnosti. V tomto prieskume sa ponoríme do funkcií „std::any“, jeho vzorov používania a praktických príkladov, ktoré ilustrujú jeho úlohu pri písaní robustného a flexibilného kódu C++.

Príklad 1: Základné použitie Std::Any

Najprv preskúmame jednoduchý príklad na demonštráciu základného použitia „std::any“. Zvážte scenár, v ktorom potrebujete funkciu na akceptovanie rôznych typov parametrov:







Tu je útržok kódu:



#include
#include

neplatný procesAkýkoľvek ( const std::any & hodnotu ) {
ak ( value.has_value ( ) ) {
std::cout << 'Typ uloženej hodnoty: ' << hodnota.typ ( ) .názov ( ) << std::endl;

ak ( hodnota.typ ( ) == typid ( int ) ) {
std::cout << 'Hodnota: ' << std::any_cast < int > ( hodnotu ) << std::endl;
} inak ak ( hodnota.typ ( ) == typid ( dvojitý ) ) {
std::cout << 'Hodnota: ' << std::any_cast < dvojitý > ( hodnotu ) << std::endl;
} inak ak ( hodnota.typ ( ) == typid ( std::string ) ) {
std::cout << 'Hodnota: ' << std::any_cast < std::string > ( hodnotu ) << std::endl;
} inak {
std::cout << 'Nepodporovaný typ!' << std::endl;
}
} inak {
std::cout << 'Žiadna hodnota uložená v std::any.' << std::endl;
}
}

int main ( ) {
procesAkýkoľvek ( 42 ) ;
procesAkýkoľvek ( 3.14 ) ;
procesAkýkoľvek ( std::string ( 'Ahoj, std::any!' ) ) ;
procesAkýkoľvek ( 4,5f ) ; // Nepodporované typu

vrátiť 0 ;
}


V tomto príklade definujeme funkciu „processAny“, ktorá berie ako parameter referenciu „std::any“ a skúma jej obsah. Vo vnútri funkcie najprv skontrolujeme, či má premenná „std::any“ uloženú hodnotu pomocou has_value(). Ak je prítomná hodnota, pomocou type().name() určíme typ uloženej hodnoty a pristúpime k vytlačeniu zodpovedajúcej hodnoty na základe jej typu. Hlavná funkcia potom demonštruje užitočnosť „processAny“ jej volaním s rôznymi typmi: celé číslo (42), dvojité (3.14) a reťazec („Ahoj, std::any!“). Funkcia vhodne spracuje každý typ a vypíše príslušné hodnoty. Avšak pri pokuse o spracovanie čísla s pohyblivou rádovou čiarkou (4.5f), ktoré nie je v tomto príklade podporované, program elegantne rieši situáciu tak, že označí, že typ nie je podporovaný.



Vygenerovaný výstup je:






Toto ukazuje, ako „std::any“ umožňuje dynamickú manipuláciu s rôznymi typmi údajov, čo z neho robí všestranný nástroj pre všeobecné programovanie v C++.

Príklad 2: Uloženie užívateľom definovaných typov

Druhý príklad skúma, ako tento dynamický typ v rámci knižnice štandardných šablón (STL) bez problémov prispôsobuje vlastné dátové štruktúry. Zamerajúc sa na užívateľsky definovaný typ, štruktúru bodov, ukážeme, ako „std::any“ zaobchádza s inštanciami takýchto štruktúr.



Tu je kód:

#include
#include

trieda MojaTrieda {
verejné:
Moja trieda ( int hodnota ) : údaje ( hodnotu ) { }

zrušiť tlačové údaje ( ) konšt {
std::cout << 'Údaje v MyClass: ' << údajov << std::endl;
}

súkromné:
int dáta;
} ;

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

ak ( anyObject.has_value ( ) ) {
auto & myClassInstance = std::any_cast < Moja trieda &> ( anyObject ) ;
myClassInstance.printData ( ) ;
} inak {
std::cout << 'Žiadna hodnota uložená v std::any.' << std::endl;
}

vrátiť 0 ;
}


V tomto úryvku kódu C++ vytvoríme jednoduchý príklad na ilustráciu pomocou typu „std::any“ s používateľom definovanou triedou s názvom „MyClass“. V rámci triedy existuje súkromná členská premenná s názvom „data“ a verejná metóda s názvom printData() na zobrazenie hodnoty týchto údajov. Celočíselná hodnota sa odovzdá a priradí k členu „údaje“ v konštruktore.

Vo funkcii „main“ vytvoríme inštanciu objektu „MyClass“ s počiatočnou hodnotou 42 a potom ho uložíme do premennej „std::any“ s názvom „anyObject“. Toto demonštruje schopnosť „std::any“ uchovávať inštancie tried definovaných používateľom.

Potom použijeme príkaz „if“ na kontrolu, či má „anyObject“ hodnotu pomocou metódy has_value(). Ak existuje hodnota, získame uložený objekt pomocou „std::any_cast“. „Std::any_cast“ sa používa s argumentom šablóny „MyClass&“ na pretypovanie uloženého objektu na referenciu „MyClass“. Táto referencia, „myClassInstance“, sa potom používa na volanie metódy printData(), ktorá demonštruje schopnosť pristupovať a pracovať s uloženým používateľom definovaným typom v rámci „std::any“.

Ak v „std::any“ nie je uložená žiadna hodnota, vytlačíme správu, ktorá to znamená. Táto podmienená kontrola zaisťuje, že zvládneme scenáre, v ktorých môže byť premenná „std::any“ prázdna.

Tu je výstup:

Príklad 3: Nádoba zmiešaných typov

V programovaní sa „kontajner zmiešaného typu“ vzťahuje na dátovú štruktúru, ktorá je schopná uchovávať prvky rôznych, potenciálne nesúvisiacich dátových typov. Táto flexibilita je cenná pri riešení scenárov, kde sú dátové typy neznáme v čase kompilácie alebo sa dynamicky menia počas vykonávania programu. V C++ je tento koncept príkladom „std::any“, ktorý umožňuje vytvorenie jedného kontajnera na ukladanie hodnôt rôznych typov.

Poďme preskúmať scenár, v ktorom vytvoríme kontajner, ktorý obsahuje rôzne typy:

#include
#include
#include

int main ( ) {

std::vektor < std::akýkoľvek > zmiešaný kontajner;

mixedContainer.push_back ( 42 ) ;
mixedContainer.push_back ( 3.14 ) ;
mixedContainer.push_back ( std::string ( 'Ahoj' ) ) ;
mixedContainer.push_back ( pravda ) ;

pre ( const auto & prvok : zmiešaný kontajner ) {
ak ( prvok.typ ( ) == typid ( int ) ) {
std::cout << 'Celé číslo: ' << std::any_cast < int > ( element ) << std::endl;
} inak ak ( prvok.typ ( ) == typid ( dvojitý ) ) {
std::cout << 'Dvojité: ' << std::any_cast < dvojitý > ( element ) << std::endl;
} inak ak ( prvok.typ ( ) == typid ( std::string ) ) {
std::cout << 'Reťazec: ' << std::any_cast < std::string > ( element ) << std::endl;
} inak ak ( prvok.typ ( ) == typid ( bool ) ) {
std::cout << 'Boolean: ' << std::any_cast < bool > ( element ) << std::endl;
} inak {
std::cout << 'Neznámy typ' << std::endl;
}
}

vrátiť 0 ;
}


Na tomto obrázku demonštrujeme koncept kontajnera zmiešaného typu pomocou C++ a funkcie „std::any“. Vytvárame „std::vector“ s názvom „mixedContainer“, ktorý slúži ako náš kontajner na uloženie prvkov rôznych typov údajov. Pomocou funkcie „push_back“ naplníme tento kontajner rôznymi prvkami vrátane celého čísla (42), dvojitého čísla (3.14), reťazca („Ahoj“) a logickej hodnoty (true).

Keď prechádzame cez „mixedContainer“ pomocou cyklu „for“, používame funkciu type () na dynamickú identifikáciu dátového typu každého prvku. Pomocou „std::any_cast“ extrahujeme a vytlačíme zodpovedajúce hodnoty na základe ich typov. Napríklad, ak je prvok typu „int“, vytlačíme ho ako celé číslo. Ak je typu „double“, vytlačíme ju ako dvojitú atď.

Tu je vygenerovaný výstup:

Príklad 4: Spracovanie chýb pomocou Std::Any

Riešenie chýb pri použití „std::any“ zahŕňa kontrolu, či je typ podporovaný alebo či je uložená hodnota. V tomto príklade ukážeme, ako zaobchádzať s nepodporovanými typmi:

#include
#include

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

skúste {

double value = std::any_cast < dvojitý > ( myAny ) ;
std::cout << 'Hodnota: ' << hodnotu << std::endl;
} chytiť ( const std::bad_any_cast & to je ) {

std::cerr << 'Chyba: ' << e.čo ( ) << std::endl;
}

vrátiť 0 ;
}


Začneme inicializáciou premennej „std::any“, „myAny“, s hodnotou 42 typu celé číslo. V nasledujúcom bloku „try“ urobíme explicitný pokus o pretypovanie tejto celočíselnej hodnoty na „double“ pomocou operácie „std::any_cast“. Keďže však skutočný typ, ktorý je uložený v „myAny“, je celé číslo, táto operácia pretypovania je neplatná pre „double“, čo vedie k typu nesúladu.

Aby sme túto potenciálnu chybu zvládli elegantne, implementujeme spracovanie výnimiek pomocou bloku „catch“, ktorý je navrhnutý tak, aby zachytil špecifický typ výnimky „std::bad_any_cast“. V prípade neúspešného obsadenia sa aktivuje blok „catch“ a pomocou „std::cerr“ vygenerujeme chybové hlásenie, aby sme oznámili povahu chyby. Táto stratégia odstraňovania chýb zaisťuje, že náš program dokáže elegantne zvládnuť situácie, v ktorých sa typ pokusu dostane do konfliktu so skutočným typom, ktorý je uložený v premennej „std::any“.

Záver

V tomto článku sme skúmali aplikácie „std::any“ v C++, kontajneri dynamického typu, ktorý je zavedený v C++ pre hodnoty rôznych typov. Jeho všestrannosť sme demonštrovali prostredníctvom rôznych príkladov, ktoré predstavujú scenáre, ktoré siahajú od základného použitia až po manipuláciu s používateľmi definovanými typmi a heterogénnymi kolekciami. Ukázali sme jeho praktickú aplikáciu v scenároch, kde typ údajov nie je známy v čase kompilácie. Okrem toho sme preskúmali techniky spracovania chýb, pričom sme zdôraznili dôležitosť elegantnej správy nepodporovaných typov pomocou spracovania výnimiek.