C++ Std ::Facultatif

C Std Facultatif



La fonctionnalité « std::optional » est fournie en C++17. Le « std::optional » permet une représentation de type sécurisé de valeurs facultatives ou un choix d'avoir une valeur. Une classe de modèle appelée « std::optional » contient une valeur facultative qui peut ou non contenir une valeur valide. Il s'agit d'un substitut plus sûr pour représenter les valeurs vides ou facultatives que les pointeurs bruts ou d'autres techniques. Le « std :: optionnel » minimise la possibilité d'erreurs de déréférencement de pointeur nul en obligeant l'utilisateur à vérifier explicitement si une valeur existe avant de la récupérer.

Exemple 1:

Les fichiers d'en-tête « optionnel » et « iostream » sont importés dans ce code. Nous devons importer ces fichiers d'en-tête afin de pouvoir accéder facilement aux fonctions qui y sont définies. Après cela, nous incluons le « namespace std » afin que nous n'ayons pas à le saisir avec des fonctions séparément comme « std :: optional » et « std :: cout ». Nous utilisons ici « namespace std ». Donc, maintenant, nous plaçons le « optionnel » ou « cout » sans taper « std » avec eux.

Ensuite, nous invoquons main() et plaçons « facultatif » et le définissons sur « int » et déclarons « myNum ». C'est la syntaxe pour déclarer la variable « std::optional ». Ensuite, nous initialisons une autre variable nommée « valeur » et attribuons une valeur à la variable « myNum » en utilisant la fonction value_or(). Nous passons « 99 » dans cette fonction, donc elle attribue ce « 99 » à la variable « muNum » s'il n'y a aucune valeur présente et la stocke dans la variable « value ». Ensuite, nous plaçons « cout » en dessous, ce qui aide à afficher la valeur que nous avons attribuée à la variable au-dessus.







Codage 1 :

#include

#include

en utilisant l'espace de noms std ;

int principal ( ) {

facultatif < int > monNum ;

int valeur = monNum. valeur_ou ( 99 ) ;

cout << 'La valeur de monNum est : ' << valeur << fin ;

retour 0 ;

}

Sortir:



Ici, nous pouvons remarquer que « 99 » est affiché, ce qui signifie que la valeur n'était pas présente ci-dessus et que la valeur que nous avons ajoutée est affectée à cette variable.







Exemple 2 :

Nous incluons d’abord les fichiers d’en-tête et plaçons le « namespace std ». Maintenant, en dessous, nous déclarons la fonction « std::optional » qui est le « DivideFunc() ». Le « dividende » et le « diviseur » sont les deux paramètres de cette fonction. Nous utilisons ensuite « si » en dessous où nous ajoutons une condition qui dit « diviseur ! = 0 ». Si cela est satisfait, il renvoie la réponse de cette division car nous ajoutons « retour » à l'intérieur. Sinon, il renvoie « nullopt », ce qui signifie aucune valeur de type sécurisé. Maintenant, nous invoquons la fonction main(). Pour déduire le 'std::optional', nous plaçons 'divideFunc()' et y ajoutons '27, 3' et attribuons le résultat à la variable 'quotient'.

Ici, nous utilisons le mot-clé « auto » pour qu'il ajuste automatiquement son type de données. Après cela, nous ajoutons le « if » où nous utilisons le « has-value » qui détermine si une valeur de type est reçue. Ensuite, nous plaçons le « cout » qui rend le résultat qui est stocké dans la variable « quotient », et la partie « else » contient une instruction qui rend que le diviseur est zéro.



Code 2 :

#include

#include

en utilisant l'espace de noms std ;

facultatif < int > diviserFunc ( int dividende , int diviseur ) {

si ( diviseur != 0 ) {

retour dividende / diviseur ;

}

retour nullopt ;

}

int principal ( ) {

auto quotient = diviserFunc ( 27 , 3 ) ;

si ( quotient. has_value ( ) ) {

cout << 'Le quotient est : ' << quotient. valeur ( ) << fin ;

} autre {

cout << 'Le diviseur est nul ici' << fin ;

}

retour 0 ;

}

Sortir:

La sortie affiche le résultat après division, ce qui signifie que le diviseur n'est pas nul. Dans ce cas, « std::optional » est utilisé pour déterminer si une valeur existe ou non en toute sécurité.

Exemple 3 :

Ici, nous déclarons la variable « std::optional » qui est le « numéro » à l’intérieur de main(). Ensuite, nous utilisons « if » dans lequel nous plaçons la fonction has_value() avec cette variable « number ». Ceci vérifie s'il y a une valeur ou non dans cette variable « nombre ». Si la variable « numéro » contient une valeur, elle restitue l'instruction que nous avons ajoutée après « if ». Sinon, cela restitue la déclaration que nous avons placée après « else ».

Maintenant, nous initialisons le « nombre » avec « 92 » et utilisons à nouveau « si » en dessous où la fonction has_value() est ajoutée avec la variable « nombre » dans le « si comme condition ». Ceci détermine si la variable « nombre » a ou non une valeur. La phrase que nous ajoutons après « si » est rendue si la variable « nombre » a une valeur. Sinon, l’instruction que nous plaçons après « sinon » est rendue.

Code 3 :

#include

#include

int principal ( ) {

norme :: facultatif < int > nombre ;

si ( nombre. has_value ( ) ) {

norme :: cout << « Le numéro est présent : » << nombre. valeur ( ) << norme :: fin ;

} autre {

norme :: cout << 'Le numéro n'est pas présent.' << norme :: fin ;

}

nombre = 92 ;

si ( nombre. has_value ( ) ) {

norme :: cout << « Le numéro est présent : » << nombre. valeur ( ) << norme :: fin ;

} autre {

norme :: cout << 'Le numéro n'est pas présent.' << norme :: fin ;

}

retour 0 ;

}

Sortir:

Cela restitue d'abord la partie « else » car nous n'attribuons aucune valeur à la variable « std::optional ». Ensuite, nous attribuons une valeur à cette variable pour afficher cette valeur dans la ligne suivante.

Exemple 4 :

Maintenant, nous déclarons trois variables « std :: optionnel » qui sont « n1 », « n2 » et « n3 ». Nous attribuons également les valeurs aux variables « n2 » et « n3 » qui sont respectivement « 29 » et « 45 ». La variable « n1 » de la classe « std::optional » est ici vide. Maintenant, nous utilisons le « boolalpha » qui aide à renvoyer le retour sous la forme « vrai » ou « faux » plutôt que « 1 » et « 0 ».

Après cela, nous utilisons les opérateurs relationnels entre ces variables « std :: optionnel » et plaçons chaque instruction à l'intérieur du « cout » afin qu'elle restitue également le résultat de la comparaison que nous avons ajoutée. Tout d'abord, il vérifie que « n3 > n2 », puis « n3 < n2 », « n1 < n2 », « n1 == std::nullopt ». Ici, « nullopt » est utilisé pour comparer la valeur sans type sûr ou null. Ensuite, nous vérifions séparément « n2 == 49 » et « n3 == 88 » à l'intérieur de l'instruction « cout ».

Code 4 :

#include

#include

int principal ( )

{

norme :: facultatif < int > n1 ;

norme :: facultatif < int > n2 ( 29 ) ;

norme :: facultatif < int > n3 ( Quatre cinq ) ;

norme :: cout << norme :: alphanumérique ;

norme :: cout << 'Le n3 > n2' << ( n3 > n2 ) << norme :: fin ;

norme :: cout << 'Le n3 < n2' << ( n3 < n2 ) << norme :: fin ;

norme :: cout << 'Le n1 < n2' << ( n1 < n2 ) << norme :: fin ;

norme :: cout << 'Le n1 == nul' << ( n1 == norme :: nullopt ) << norme :: fin ;

norme :: cout << 'Le n2 == 49' << ( n2 == 29 ) << norme :: fin ;

norme :: cout << 'Le n3 == 88' << ( n3 == 88 ) << norme :: fin ;

}

Sortir:

Le programme C++ que nous avons mentionné précédemment compare diverses valeurs de variables du type « std::optional » tout en imprimant simultanément le résultat sur la sortie.

Exemple 5 :

Les fichiers d'en-tête inclus dans ce code sont « iostream », « fstream », « facultatif » et « string ». Le « fstream » contient la définition des deux fonctions « ofstream » et « ifstream » dont nous avons besoin dans ce code. Maintenant, nous incluons le « namespace std », nous ne le plaçons donc pas séparément avec chaque fonction. Ensuite, nous utilisons le « std:optional » et déclarons une fonction avec le nom « ReadFileFunc » dans laquelle nous passons « const string& f_Name » comme argument.

Ensuite, nous avons « ifstream » qui permet de lire le fichier dont le nom sera ajouté à la variable « f_name ». Ensuite, nous utilisons « if » dans lequel nous incluons la condition qui dit que si le fichier n'est pas ouvert, il renvoie « nullopt » car nous l'avons ajouté sous l'instruction « if ». Ensuite, nous créons une autre fonction qui est « fileContent » qui aide à écrire le contenu dans le fichier si le fichier est ouvert. Ici, nous plaçons à nouveau le « return fileContent » qui renvoie également le contenu que nous avons ajouté au fichier après ouverture.

Maintenant, nous appelons ici le « main() » dans lequel nous initialisons la variable « f_Name » avec le nom du fichier « Sample.txt » que nous voulons ouvrir. Ensuite, nous appelons ici « ReadFileFunc() » et passons la variable « f_Name » dans cette fonction qui tente de lire le fichier et stocke son contenu dans la variable « f_content ». En dessous, nous utilisons le « has_value() » avec la variable « f_content » dans « if ». Si cette variable contient une valeur, elle la restitue également car nous avons ajouté le « cout » sous « if » dans lequel nous avons également placé le « f_content ». Sinon, il affiche l'erreur que nous avons ajoutée après « else ».

Code 5 :

#include

#include

#include

#include

en utilisant l'espace de noms std ;

facultatif < chaîne > LireFichierFunc ( const chaîne & f_Nom ) {

ifstream monFichier ( f_Nom ) ;

si ( ! mon fichier. est ouvert ( ) ) {

retour nullopt ;

}

chaîne de contenu de fichier ( ( isstreambuf_iterator < carboniser > ( mon fichier ) ) , isstreambuf_iterator < carboniser > ( ) ) ;

retour contenu du fichier ;

}

int principal ( ) {

const chaîne f_Name = 'Exemple.txt' ;

auto f_content = LireFichierFunc ( f_Nom ) ;

si ( f_content. has_value ( ) ) {

cout << 'Le contenu du dossier est : \n ' << f_content. valeur ( ) << fin ;

} autre {

cerr << 'Erreur : fichier non ouvert ici » << f_Nom << fin ;

}

retour 0 ;

}

Sortir:

Ici, il montre la déclaration d'erreur que nous avons ajoutée dans la partie « else » comme résultat du code donné.

Conclusion

Dans ce didacticiel, nous avons exploré la fonctionnalité C++ forte qui est « std::optional » et expliqué qu'elle offre une méthode standardisée de représentation des valeurs facultatives, supprimant l'exigence de références nulles et améliorant la clarté et la sécurité du code. Nous avons appris que cela améliore également la capacité à expliquer les problèmes complexes et à gérer les erreurs avec grâce.