Comment travailler avec std :: tout en c
STD :: tout est un outil de stockage de type arbitraire de type introduit dans C 17. Il peut être utilisé pour enregistrer et récupérer tous les types reproductibles. Il convient pour des scénarios tels que la configuration des systèmes, des interfaces plug-in, etc. qui nécessitent des conteneurs de données hétérogènes. Lorsque vous l'utilisez, il doit inclure un fichier d'en-tête
Travailler avec std::any
en C vous permet de stocker et de récupérer des valeurs de tout type en toute sécurité, tant que vous gérez les vérifications de type et accédez correctement. Il fait partie de la bibliothèque standard C 17 et est utile lorsque vous avez besoin de conteneurs de données hétérogènes, comme lors de la création de systèmes de configuration, d'interfaces de plugin ou de détenteurs de données génériques.
Voici comment utiliser std::any
: tout:
1. y compris et utilisation de base
Pour utiliser std::any
, incluez l'en-tête <any></any>
:
#include <yhy #include <iostream> #include <string> int main () { std :: toute valeur = 42; // Stockez un int Value = std :: string ("Hello"); // maintenant stocker une chaîne }
Vous pouvez attribuer des valeurs de n'importe quel type copieable à un std::any
objet.
2. Récupération des valeurs avec std :: any_cast
Pour obtenir la valeur stockée, utilisez std::any_cast
. C'est le seul moyen sûr d'extraire les données.
Récupération avec un type correct (succès)
std :: toutes les données = 3,14; if (Auto * ptr = std :: any_cast <rouble> (& data)) { std :: cout << * ptr << '\ n'; }
Ou directement (lance std::bad_any_access
sur le non-match de type):
essayer { Double D = std :: any_cast <back> (données); std :: cout << d << '\ n'; } catch (const std :: bad_any_access &) { std :: cout << "mauvais type! \ n"; }
Récupération sûre avec un moulage du pointeur
L'utilisation d'une version de pointeur de any_cast
évite les exceptions:
if (const auto * str = std :: any_cast <std :: string> (& data)) { std :: cout << "String:" << * str << '\ n'; } else if (const auto * num = std :: any_cast <nt> (& data)) { std :: cout << "entier:" << * num << '\ n'; }
Ce modèle est utile lors de la gestion de plusieurs types possibles.
3. Types de vérification et de gestion
Vous pouvez vérifier quel type est stocké en utilisant .type()
et comparer avec typeid
.
#include <TypeInfo> if (data.type () == typeId (std :: string)) { std :: cout << "C'est une chaîne! \ n"; } else if (data.type () == typeId (int)) { std :: cout << "C'est un entier! \ n"; }
Cela fonctionne bien en combinaison avec any_cast
pour une expédition sûre.
4. Effacer ou réinitialiser Std :: tout
Pour faire un std::any
vide, attribuer {}
ou utiliser .reset()
:
data.reset (); // maintenant data.has_value () renvoie false if (! data.has_value ()) { std :: cout << "Aucune valeur stockée. \ n"; }
Vous pouvez également vérifier le vide:
if (data.has_value ()) { // sûr à lancer }
5. Stockage des types personnalisés
Vous pouvez stocker des types définis par l'utilisateur tant qu'ils sont des droits d'auteur.
Struct Person { std :: nom de chaîne; en âge; }; std :: tout P = personne {"Alice", 30}; if (const Auto * personne = std :: any_cast <som> (& p)) { std :: cout << Person-> name << "," << personne-> Âge << '\ n'; }
Remarque: std::any
exige que le type soit constructible de copie. Les types de déménagement (comme std::unique_ptr
) ne fonctionneront pas à moins que ce soit emballé (voir ci-dessous).
6. Limites et solution de contournement
- Aucun type de déménagement uniquement :
std::any
a besoin de droits d'auteur. Mais vous pouvez envelopper des types de déplacements uniquement dans unstd::unique_ptr
:
std :: tout wrapper = std :: unique_ptr <nt> (new int (42)); if (auto * ptr = std :: any_cast <std :: unique_ptr <nt>> (& wrapper)) { std :: cout << "valeur:" << ** ptr << '\ n'; }
Coût des performances : l'effacement de type et l'allocation dynamique (pour les plus grands types) peuvent ajouter des frais généraux. Évitez
std::any
dans les chemins critiques des performances si possible.Pas de conversions implicites : même
int
àdouble
échoue. Vous devez extraire le type stocké exact.
7. Exemple pratique: conteneur hétérogène
#include <Vector> #include <yhy #include <string> #include <iostream> int main () { std :: vector <std :: any> valeurs = {1, "texte", 3.14, std :: string ("bonjour")}; pour (const auto & v: valeurs) { if (v.type () == typeId (int)) { std :: cout << "int:" << std :: any_cast <nt> (v) << '\ n'; } else if (v.type () == typeId (const char *)) { std :: cout << "char *:" << std :: any_cast <const char *> (v) << '\ n'; } else if (v.type () == typeId (double)) { std :: cout << "Double:" << std :: any_cast <back> (v) << '\ n'; } else if (v.type () == typeId (std :: string)) { std :: cout << "String:" << std :: any_cast <std :: string> (v) << '\ n'; } } }
Remarque: les littéraux de chaîne sont const char*
, pas std::string
, alors soyez prudent.
Fondamentalement, std::any
est une union de type type lorsque vous avez besoin de flexibilité. Utilisez-le lorsque vous devez stocker différents types dans la même variable ou le même conteneur, mais vérifiez toujours les types avant le casting. Ce n'est pas un remplacement pour les modèles ou le polymorphisme, mais un outil pour des scénarios de type dynamique spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT
Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Installac compiler likeg usingpackageManagersordevelopmentToolsDenpeningSontheos.2.writeac programme etVeitwitha.cpppextension.3.compilethetrogramusingg hello.cpp-ohelotogenerateanexecuable.4

Utilisez la fonction STD :: System () pour exécuter les commandes système, qui doivent inclure des fichiers d'en-tête et passer dans des commandes de chaîne de style C, telles que STD :: System ("LS-L"), et la valeur de retour est -1, ce qui signifie que le processeur de commande n'est pas disponible.

L'allocateur personnalisé peut être utilisé pour contrôler le comportement d'allocation de mémoire des conteneurs C. 1. Le journal de journalisation dans l'exemple implémente la journalisation de l'opération de mémoire en surchargeant l'allocation, la transmission, la construction et la détruire des méthodes; 2. L'allocateur doit définir des modèles Value_Type et Rebind pour répondre aux exigences de conversion du type de conteneur STL; 3. L'allocateur déclenche la sortie du journal pendant la construction et la copie, ce qui est pratique pour suivre le cycle de vie; 4. Les applications réelles incluent des pools de mémoire, de la mémoire partagée, des outils de débogage et des systèmes intégrés; 5. Depuis C 17, Construct and Destroy peut être traité par STD :: ALLOCATOR_TRAITS par défaut

La réponse est de définir une classe qui contient les alias et les opérations de type nécessaire. Tout d'abord, définissez la valeur_type, référence, pointeur, différence_type et iterator_category, puis implémentez les opérations de déréférence, d'incrément et de comparaison. Enfin, fournissez des méthodes begin () et end () dans le conteneur pour renvoyer l'instance itérateur, ce qui le rend compatible avec les algorithmes STL et la plage pour les boucles.

Les systèmes en temps réel nécessitent des réponses déterministes, car l'exactitude dépend du délai de livraison des résultats; Les systèmes durs en temps réel nécessitent des délais stricts, manqués entraînera des catastrophes, tandis que le temps réel doux permet des retards occasionnels; Des facteurs non déterministes tels que la planification, les interruptions, les caches, la gestion de la mémoire, etc. affectent le calendrier; Le plan de construction comprend la sélection des RTO, l'analyse WCET, la gestion des ressources, l'optimisation matérielle et les tests rigoureux.

Une classe abstraite est une classe contenant au moins une fonction virtuelle pure. Il ne peut pas être instancié et doit être hérité en tant que classe de base. La classe dérivée doit implémenter toutes ses fonctions virtuelles pures, sinon il sera toujours une classe abstraite. 1. Les fonctions virtuelles pures sont déclarées par le type de type de retour virtuel Nom () = 0; pour définir les spécifications de l'interface; 2. 3. Des destructeurs virtuels doivent être fournis pour les classes abstraites (telles que Virtual ~ Shape () = par défaut;) pour s'assurer que les objets de classe dérivés sont correctement libérés via des pointeurs de classe de base; 4. Une fois la classe dérivée héritée, les fonctions virtuelles pures doivent être réécrites, telles que le rectangle et le cercle pour implémenter la zone () pour calculer leurs zones respectives; 5

Utilisez Std :: ifstream et STD :: ISTREAMBUF_ITERATOR pour lire efficacement le contenu entier du fichier vers les chaînes, y compris les espaces et les pauses de ligne, et convient aux fichiers texte de taille moyenne.

AstaticvariableInc conserve la valeur de l'entreprise entre la fonctionnalités et les étatsinitializedEnce.2
