Ц++ стд:било који примери

C Std Bilo Koji Primeri



У Ц++ програмирању, „стд::ани“ из библиотеке стандардних шаблона (СТЛ) уводи динамичко куцање за руковање хетерогеним подацима. За разлику од традиционалних контејнера, „стд::ани“ омогућава чување вредности било ког типа унутар једног контејнера, побољшавајући флексибилност у сценаријима где су типови података непознати или варирају током извршавања. Овај приступ који зависи од типа промовише генеричко програмирање које омогућава програмерима да креирају прилагодљивији и експресивнији код уз одржавање безбедности типа. У овом истраживању, удубићемо се у карактеристике „стд::ани“, његове обрасце коришћења и практичне примере који илуструју његову улогу у писању робусног и флексибилног Ц++ кода.

Пример 1: Основна употреба Стд::Ани

Прво, хајде да истражимо директан пример да демонстрирамо основну употребу „стд::ани“. Размотрите сценарио у којем вам је потребна функција за прихватање различитих типова параметара:







Ево исечка кода:



#инцлуде <иостреам>
#инцлуде <било који>

воид процессАни ( цонст стд::било који & вредност ) {
ако ( валуе.хас_валуе ( ) ) {
стд::цоут << 'Тип сачуване вредности: ' << тип вредности ( ) .наме ( ) << стд::ендл;

ако ( тип вредности ( ) == типеид ( инт ) ) {
стд::цоут << 'Вредност: ' << стд::ани_цаст < инт > ( вредност ) << стд::ендл;
} друго ако ( тип вредности ( ) == типеид ( дупло ) ) {
стд::цоут << 'Вредност: ' << стд::ани_цаст < дупло > ( вредност ) << стд::ендл;
} друго ако ( тип вредности ( ) == типеид ( стд::стринг ) ) {
стд::цоут << 'Вредност: ' << стд::ани_цаст < стд::стринг > ( вредност ) << стд::ендл;
} друго {
стд::цоут << „Неподржани тип!“ << стд::ендл;
}
} друго {
стд::цоут << „Нема вредности сачуване у стд::ани.“ << стд::ендл;
}
}

инт маин ( ) {
процессАни ( 42 ) ;
процессАни ( 3.14 ) ;
процессАни ( стд::стринг ( 'Здраво, стд::ани!' ) ) ;
процессАни ( 4.5ф ) ; // Неподржано тип

повратак 0 ;
}


У овом примеру дефинишемо функцију „процессАни“ која узима референцу „стд::ани“ као параметар и испитује њен садржај. Унутар функције прво проверавамо да ли променљива „стд::ани“ има сачувану вредност помоћу хас_валуе(). Ако је вредност присутна, одређујемо тип сачуване вредности користећи типе().наме() и настављамо да штампамо одговарајућу вредност на основу њеног типа. Главна функција затим демонстрира корисност „процессАни“ позивајући га различитим типовима: целим бројем (42), двоструким (3.14) и стрингом („Здраво, стд::ани!“). Функција на одговарајући начин рукује сваким типом и штампа одговарајуће вредности. Међутим, када покушавате да обради број са помичним зарезом (4.5ф), који није подржан у овом примеру, програм грациозно решава ситуацију указујући да тип није подржан.



Генерисани излаз је:






Ово показује како „стд::ани“ омогућава динамичко руковање различитим типовима података, чинећи га свестраним алатом за генеричко програмирање у Ц++.

Пример 2: Чување кориснички дефинисаних типова

Други пример истражује како овај динамички тип у оквиру библиотеке стандардних шаблона (СТЛ) неприметно прилагођава прилагођене структуре података. Фокусирајући се на кориснички дефинисани тип, структуру тачке, показујемо како „стд::ани“ рукује инстанцама таквих структура.



Ево кода:

#инцлуде <иостреам>
#инцлуде <било који>

цласс МиЦласс {
јавно:
Мој разред ( инт вредност ) : дата ( вредност ) { }

воид принтДата ( ) конст {
стд::цоут << 'Подаци у МиЦласс-у: ' << података << стд::ендл;
}

приватни:
инт дата;
} ;

инт маин ( ) {
стд::ани аниОбјецт = МиЦласс ( 42 ) ;

ако ( аниОбјецт.хас_валуе ( ) ) {
ауто & миЦлассИнстанце = стд::ани_цаст < Мој разред &> ( аниОбјецт ) ;
миЦлассИнстанце.принтДата ( ) ;
} друго {
стд::цоут << „Нема вредности сачуване у стд::ани.“ << стд::ендл;
}

повратак 0 ;
}


У овом Ц++ исечку кода креирамо једноставан пример за илустрацију коришћења типа „стд::ани“ са кориснички дефинисаном класом под називом „МиЦласс“. Унутар класе постоји приватна променљива члана која се зове „подаци“ и јавна метода која се зове принтДата() за приказ вредности ових података. Целобројна вредност се прослеђује и додељује члану „подаци“ у конструктору.

У „маин“ функцији инстанцирамо објекат „МиЦласс“ са почетном вредношћу 42 и затим га складиштимо у променљиву „стд::ани“ под називом „аниОбјецт“. Ово показује способност „стд::ани“ да држи инстанце кориснички дефинисаних класа.

Након овога, користимо наредбу „иф“ да проверимо да ли „било којиОбјекат“ има вредност помоћу методе хас_валуе(). Ако постоји вредност, преузимамо сачувани објекат користећи „стд::ани_цаст“. „стд::ани_цаст“ се користи са аргументом шаблона „МиЦласс&“ за пребацивање ускладиштеног објекта на референцу „МиЦласс“. Ова референца, „миЦлассИнстанце“, се затим користи за позивање принтДата() методе, показујући могућност приступа и рада на ускладиштеном кориснички дефинисаном типу унутар „стд::ани“.

Ако ниједна вредност није сачувана у „стд::ани“, штампамо поруку која ово означава. Ова условна провера обезбеђује да обрађујемо сценарије у којима променљива „стд::ани“ може бити празна.

Ево излаза:

Пример 3: Контејнер мешовитих типова

У програмирању, „контејнер мешовитог типа“ се односи на структуру података која је способна да држи елементе различитих, потенцијално неповезаних типова података. Ова флексибилност је драгоцена када се ради о сценаријима где су типови података непознати у време компајлирања или се динамички мењају током извршавања програма. У Ц++, „стд::ани“ представља пример овог концепта, дозвољавајући креирање једног контејнера за чување вредности различитих типова.

Хајде да истражимо сценарио у којем креирамо контејнер који садржи различите типове:

#инцлуде <иостреам>
#инцлуде <било који>
#инцлуде <вектор>

инт маин ( ) {

стд::вецтор < стд::било који > микедЦонтаинер;

микедЦонтаинер.пусх_бацк ( 42 ) ;
микедЦонтаинер.пусх_бацк ( 3.14 ) ;
микедЦонтаинер.пусх_бацк ( стд::стринг ( 'Здраво' ) ) ;
микедЦонтаинер.пусх_бацк ( истина ) ;

за ( цонст ауто & елемент : микедЦонтаинер ) {
ако ( елемент.врста ( ) == типеид ( инт ) ) {
стд::цоут << 'Цео број: ' << стд::ани_цаст < инт > ( елемент ) << стд::ендл;
} друго ако ( елемент.врста ( ) == типеид ( дупло ) ) {
стд::цоут << 'Двоструко:' << стд::ани_цаст < дупло > ( елемент ) << стд::ендл;
} друго ако ( елемент.врста ( ) == типеид ( стд::стринг ) ) {
стд::цоут << 'Низ: ' << стд::ани_цаст < стд::стринг > ( елемент ) << стд::ендл;
} друго ако ( елемент.врста ( ) == типеид ( боол ) ) {
стд::цоут << 'Боолеан: ' << стд::ани_цаст < боол > ( елемент ) << стд::ендл;
} друго {
стд::цоут << 'Непознат тип' << стд::ендл;
}
}

повратак 0 ;
}


На овој илустрацији демонстрирамо концепт контејнера мешовитог типа користећи Ц++ и функцију „стд::ани“. Креирамо „стд::вецтор<стд::ани>” под називом „микедЦонтаинер” да служи као наш контејнер за држање елемената различитих типова података. Користећи функцију „пусх_бацк“, овај контејнер попуњавамо различитим елементима укључујући цео број (42), дупли број (3.14), стринг („Здраво“) и логички (тачно).

Док пролазимо кроз „микедЦонтаинер“ користећи „фор“ петљу, користимо функцију типе() да бисмо динамички идентификовали тип података сваког елемента. Користећи „стд::ани_цаст“, ​​издвајамо и штампамо одговарајуће вредности на основу њихових типова. На пример, ако је елемент типа „инт“, штампамо га као цео број. Ако је типа „двоструко“, штампамо га као дупло, и тако даље.

Ево генерисаног излаза:

Пример 4: Руковање грешкама са Стд::Би

Руковање грешкама када се користи „стд::ани“ укључује проверу да ли је тип подржан или да ли је вредност сачувана. У овом примеру демонстрирамо како се поступа са неподржаним типовима:

#инцлуде <иостреам>
#инцлуде <било који>

инт маин ( ) {
стд::ани миАни = 42 ;

покушати {

двострука вредност = стд::ани_цаст < дупло > ( миАни ) ;
стд::цоут << 'Вредност: ' << вредност << стд::ендл;
} улов ( цонст стд::бад_ани_цаст & То је ) {

стд::церр << 'Грешка: ' << е.шта ( ) << стд::ендл;
}

повратак 0 ;
}


Почињемо тако што ћемо иницијализовати променљиву „стд::ани“, „миАни“, са вредношћу 42 целобројног типа. Унутар следећег блока „покушај“ изричито покушавамо да ову целобројну вредност претворимо у „доубле“ користећи операцију „стд::ани_цаст<доубле>“. Међутим, пошто је стварни тип који се чува у „миАни“ цео број, ова операција преливања је неважећа за „доубле“ што доводи до неподударања типа.

Да бисмо елегантно управљали овом потенцијалном грешком, имплементирамо руковање изузетком са блоком „цатцх“ који је дизајниран да ухвати специфичан тип изузетка „стд::бад_ани_цаст“. У случају неуспешног пребацивања, активира се блок „цатцх“ и генеришемо поруку о грешци користећи „стд::церр“ да бисмо саопштили природу грешке. Ова стратегија руковања грешкама осигурава да наш програм може елегантно да се носи са ситуацијама у којима се покушано пребацивање типа сукобљава са стварним типом који је ускладиштен у променљивој „стд::ани“.

Закључак

У овом чланку смо истражили примене „стд::ани“ у Ц++-у, контејнеру динамичког типа који је уведен у Ц++ за вредности различитих типова. Показали смо његову свестраност кроз различите примере, приказујући сценарије који се крећу од основне употребе до руковања кориснички дефинисаним типовима и хетерогеним колекцијама. Показали смо његову практичну примену у сценаријима где тип података није познат у време компајлирања. Поред тога, истражили смо о техникама руковања грешкама, наглашавајући важност елегантног управљања неподржаним типовима кроз руковање изузетцима.