C++ std:jakékoli příklady

C Std Jakekoli Priklady



V programování C++ zavádí „std::any“ z knihovny standardních šablon (STL) dynamické psaní pro zpracování heterogenních dat. Na rozdíl od tradičních kontejnerů umožňuje „std::any“ ukládat hodnoty libovolného typu do jednoho kontejneru, což zvyšuje flexibilitu ve scénářích, kde jsou datové typy neznámé nebo se za běhu mění. Tento typově agnostický přístup podporuje generické programování, které umožňuje vývojářům vytvářet přizpůsobivější a výraznější kód při zachování bezpečnosti typu. V tomto průzkumu se ponoříme do funkcí „std::any“, jeho vzorců použití a praktických příkladů, které ilustrují jeho roli při psaní robustního a flexibilního kódu C++.

Příklad 1: Základní použití Std::Any

Nejprve se podívejme na jednoduchý příklad, který demonstruje základní použití „std::any“. Zvažte scénář, kdy potřebujete funkci, která přijímá různé typy parametrů:







Zde je fragment kódu:



#include
#include

neplatný proces Jakýkoli ( const std::any & hodnota ) {
-li ( value.has_value ( ) ) {
std::cout << 'Typ uložené hodnoty: ' << typ hodnoty ( ) .název ( ) << std::endl;

-li ( typ hodnoty ( ) == typid ( int ) ) {
std::cout << 'Hodnota:' << std::any_cast < int > ( hodnota ) << std::endl;
} jiný -li ( typ hodnoty ( ) == typid ( dvojnásobek ) ) {
std::cout << 'Hodnota:' << std::any_cast < dvojnásobek > ( hodnota ) << std::endl;
} jiný -li ( typ hodnoty ( ) == typid ( std::string ) ) {
std::cout << 'Hodnota:' << std::any_cast < std::string > ( hodnota ) << std::endl;
} jiný {
std::cout << 'Nepodporovaný typ!' << std::endl;
}
} jiný {
std::cout << 'V std::any není uložena žádná hodnota.' << std::endl;
}
}

int main ( ) {
zpracovatJakýkoli ( 42 ) ;
zpracovatJakýkoli ( 3.14 ) ;
zpracovatJakýkoli ( std::string ( 'Ahoj, std::any!' ) ) ;
zpracovatJakýkoli ( 4,5f ) ; // Nepodporováno typ

vrátit se 0 ;
}


V tomto příkladu definujeme funkci „processAny“, která bere jako parametr odkaz „std::any“ a zkoumá jeho obsah. Uvnitř funkce nejprve zkontrolujeme, zda má proměnná „std::any“ uloženou hodnotu pomocí has_value(). Pokud je přítomna hodnota, určíme typ uložené hodnoty pomocí type().name() a přistoupíme k tisku odpovídající hodnoty na základě jejího typu. Hlavní funkce pak demonstruje užitečnost „processAny“ voláním různých typů: celé číslo (42), double (3.14) a řetězec („Ahoj, std::any!“). Funkce vhodně zpracuje každý typ a vytiskne příslušné hodnoty. Při pokusu o zpracování čísla s plovoucí desetinnou čárkou (4.5f), které není v tomto příkladu podporováno, však program situaci elegantně zpracuje a označí, že typ není podporován.



Vygenerovaný výstup je:






To ukazuje, jak „std::any“ umožňuje dynamické zacházení s různými datovými typy, což z něj činí univerzální nástroj pro obecné programování v C++.

Příklad 2: Uložení uživatelem definovaných typů

Druhý příklad zkoumá, jak tento dynamický typ v rámci knihovny standardních šablon (STL) bezproblémově vyhovuje uživatelským datovým strukturám. Zaměříme-li se na uživatelsky definovaný typ, bodovou strukturu, ukážeme, jak „std::any“ zachází s instancemi takových struktur.



Zde je kód:

#include
#include

třída MyClass {
veřejnost:
Moje třída ( hodnota int ) : údaje ( hodnota ) { }

zrušit tisková data ( ) konst {
std::cout << 'Data v MyClass:' << data << std::endl;
}

soukromé:
int data;
} ;

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

-li ( anyObject.has_value ( ) ) {
auto & myClassInstance = std::any_cast < Moje třída &> ( anyObject ) ;
myClassInstance.printData ( ) ;
} jiný {
std::cout << 'V std::any není uložena žádná hodnota.' << std::endl;
}

vrátit se 0 ;
}


V tomto úryvku kódu C++ vytvoříme jednoduchý příklad pro ilustraci pomocí typu „std::any“ s uživatelsky definovanou třídou nazvanou „MyClass“. V rámci třídy je soukromá členská proměnná nazvaná „data“ a veřejná metoda nazvaná printData() pro zobrazení hodnoty těchto dat. Celočíselná hodnota je předána a přiřazena členu „data“ v konstruktoru.

Ve funkci „main“ vytvoříme instanci objektu „MyClass“ s počáteční hodnotou 42 a poté jej uložíme do proměnné „std::any“ s názvem „anyObject“. To demonstruje schopnost „std::any“ uchovávat instance uživatelsky definovaných tříd.

Poté použijeme příkaz „if“ ke kontrole, zda má „anyObject“ hodnotu pomocí metody has_value(). Pokud existuje hodnota, načteme uložený objekt pomocí „std::any_cast“. 'Std::any_cast' se používá s argumentem šablony 'MyClass&' k přetypování uloženého objektu na odkaz 'MyClass'. Tento odkaz, „myClassInstance“, se pak používá k volání metody printData(), která ukazuje možnost přístupu a práce s uloženým uživatelem definovaným typem v rámci „std::any“.

Pokud v „std::any“ není uložena žádná hodnota, vypíšeme zprávu, která to znamená. Tato podmíněná kontrola zajišťuje, že zvládneme scénáře, kde může být proměnná „std::any“ prázdná.

Zde je výstup:

Příklad 3: Nádoba smíšených typů

V programování se „kontejner smíšeného typu“ týká datové struktury, která je schopna pojmout prvky různých, potenciálně nesouvisejících datových typů. Tato flexibilita je cenná při řešení scénářů, kde jsou datové typy neznámé v době kompilace nebo se dynamicky mění během provádění programu. V C++ je příkladem tohoto konceptu „std::any“, který umožňuje vytvoření jediného kontejneru pro ukládání hodnot různých typů.

Pojďme prozkoumat scénář, ve kterém vytvoříme kontejner, který obsahuje různé typy:

#include
#include
#include

int main ( ) {

std::vektor < std::jakýkoli > smíšený kontejner;

mixedContainer.push_back ( 42 ) ;
mixedContainer.push_back ( 3.14 ) ;
mixedContainer.push_back ( std::string ( 'Ahoj' ) ) ;
mixedContainer.push_back ( skutečný ) ;

pro ( const auto & prvek : mixedContainer ) {
-li ( prvek.typ ( ) == typid ( int ) ) {
std::cout << 'Celé číslo: ' << std::any_cast < int > ( živel ) << std::endl;
} jiný -li ( prvek.typ ( ) == typid ( dvojnásobek ) ) {
std::cout << 'Dvojité:' << std::any_cast < dvojnásobek > ( živel ) << std::endl;
} jiný -li ( prvek.typ ( ) == typid ( std::string ) ) {
std::cout << 'Tětiva: ' << std::any_cast < std::string > ( živel ) << std::endl;
} jiný -li ( prvek.typ ( ) == typid ( bool ) ) {
std::cout << 'Boolean: ' << std::any_cast < bool > ( živel ) << std::endl;
} jiný {
std::cout << 'Neznámý typ' << std::endl;
}
}

vrátit se 0 ;
}


Na tomto obrázku demonstrujeme koncept kontejneru smíšeného typu pomocí C++ a funkce „std::any“. Vytváříme „std::vector“ s názvem „mixedContainer“, který bude sloužit jako náš kontejner pro uložení prvků různých datových typů. Pomocí funkce „push_back“ naplníme tento kontejner různými prvky, včetně celého čísla (42), double (3.14), řetězce („Ahoj“) a booleanu (true).

Když procházíme „mixedContainer“ pomocí smyčky „for“, používáme funkci type() k dynamické identifikaci datového typu každého prvku. Pomocí „std::any_cast“ extrahujeme a vytiskneme odpovídající hodnoty na základě jejich typů. Pokud je například prvek typu „int“, vytiskneme jej jako celé číslo. Pokud je typu „double“, vytiskneme ji jako dvojitou a tak dále.

Zde je vygenerovaný výstup:

Příklad 4: Zpracování chyb pomocí Std::Any

Zpracování chyb při použití „std::any“ zahrnuje kontrolu, zda je typ podporován nebo zda je uložena hodnota. V tomto příkladu si ukážeme, jak zacházet s nepodporovanými typy:

#include
#include

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

Snaž se {

double value = std::any_cast < dvojnásobek > ( myAny ) ;
std::cout << 'Hodnota:' << hodnota << std::endl;
} chytit ( const std::bad_any_cast & to je ) {

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

vrátit se 0 ;
}


Začneme inicializací proměnné „std::any“, „myAny“, s hodnotou 42 typu integer. Uvnitř následujícího bloku „try“ se explicitně pokusíme přetypovat tuto celočíselnou hodnotu na „double“ pomocí operace „std::any_cast“. Protože však skutečný typ, který je uložen v „myAny“, je celé číslo, je tato operace přetypování neplatná pro „double“, což vede k typu neshody.

Abychom tuto potenciální chybu zvládli elegantně, implementujeme zpracování výjimek pomocí bloku „catch“, který je navržen tak, aby zachytil specifický typ výjimky „std::bad_any_cast“. V případě neúspěšného obsazení se aktivuje blok „catch“ a pomocí „std::cerr“ vygenerujeme chybové hlášení, abychom sdělili povahu chyby. Tato strategie zpracování chyb zajišťuje, že náš program dokáže elegantně zvládnout situace, kdy se pokus o přetypování typu střetne se skutečným typem, který je uložen v proměnné „std::any“.

Závěr

V tomto článku jsme prozkoumali aplikace „std::any“ v C++, kontejneru dynamického typu, který je zaveden v C++ pro hodnoty různých typů. Jeho všestrannost jsme demonstrovali na různých příkladech, předváděli scénáře, které sahají od základního použití až po manipulaci s uživatelsky definovanými typy a heterogenními kolekcemi. Ukázali jsme jeho praktickou aplikaci ve scénářích, kdy typ dat není v době kompilace znám. Kromě toho jsme prozkoumali techniky zpracování chyb a zdůraznili důležitost elegantní správy nepodporovaných typů prostřednictvím zpracování výjimek.