STD :: ENDLICH ist ein in C 17 eingeführter Typ-sicherer willkürlicher Typ-Speicherwerkzeug. Es kann zum Speichern und Abrufen von Replementtypen verwendet werden. Es ist für Szenarien wie Konfigurieren von Systemen, Plug-in-Schnittstellen usw. geeignet, für die heterogene Datenbeh?lter erforderlich sind. Bei der Verwendung muss eine
Durch die Arbeit mit std::any
in C k?nnen Sie Werte jeder Art sicher speichern und abrufen, solange Sie Typ -überprüfungen verwalten und ordnungsgem?? zugreifen. Es ist Teil der Standardbibliothek C 17 und nützlich, wenn Sie heterogene Datencontainer ben?tigen - wie beim Erstellen von Konfigurationssystemen, Plugin -Schnittstellen oder generischen Dateninhabern.
Hier erfahren Sie, wie Sie std::any
Effektiv verwenden:
1. und grundlegende Nutzung
std::any
zu verwenden, geben Sie den <any></any>
Header an:
#Include <Nod> #include <iostream> #include <string> int main () { std :: beliebiger Wert = 42; // einen int speichern value = std :: string ("Hallo"); // Jetzt eine Zeichenfolge speichern }
Sie k?nnen einem std::any
Objekt Werte eines kopierbaren Typs zuweisen.
2. Rufen Sie Werte mit std :: Any_cast ab
Verwenden Sie std::any_cast
, um den gespeicherten Wert zu erhalten. Dies ist der einzige sichere Weg, um Daten zu extrahieren.
Mit dem richtigen Typ (Erfolg) abrufen
std :: irgendwelche Daten = 3.14; if (auto* ptr = std :: Any_Cast <Double> (& data)) { std :: cout << *ptr << '\ n'; }
Oder direkt (l?st std::bad_any_access
auf Typfehlanpassung):
versuchen { double d = std :: Any_Cast <Double> (Daten); std :: cout << d << '\ n'; } catch (const std :: bad_any_access &) { std :: cout << "Falscher Typ! \ n"; }
Sicheres Abruf mit Zeigerguss
Durch die Verwendung einer Zeigerversion von any_cast
wird Ausnahmen vermieden:
if (const auto* str = std :: Any_Cast <Std :: String> (& Daten)) { std :: cout << "String:" << *str << '\ n'; } else if (const auto* num = std :: Any_Cast <int> (& data)) { std :: cout << "Integer:" << *num << '\ n'; }
Dieses Muster ist nützlich, wenn mehrere m?gliche Typen behandelt werden.
3.. überprüfen und Verwalten von Typen
Sie k?nnen überprüfen, welcher Typ mit .type()
gespeichert und mit typeid
verglichen wird.
#include <Typinfo> if (data.type () == typeId (std :: string)) { std :: cout << "Es ist eine Zeichenfolge! \ n"; } else if (data.type () == typeId (int)) { std :: cout << "Es ist eine Ganzzahl! \ n"; }
Dies funktioniert gut in Kombination mit any_cast
für einen sicheren Versand.
4.. L?schen oder Zurücksetzen std :: Any
Um ein std::any
leer zu machen, zuweisen Sie {}
oder verwenden Sie .reset()
:
Data.Reset (); // jetzt data.has_value () gibt false zurück if (! data.has_value ()) { std :: cout << "Kein Wert gespeichert. \ n"; }
Sie k?nnen auch die Leere überprüfen:
if (data.has_value ()) { // sicher zu besetzen }
5. Speichern benutzerdefinierte Typen
Sie k?nnen benutzerdefinierte Typen speichern, solange sie urheberrechtlich geschützt sind.
Struktur Person { std :: string name; int Alter; }; std :: irgendwelche p = Person {"Alice", 30}; if (const auto* person = std :: Any_Cast <Person> (& p)) { std :: cout << Person-> Name << "," << Person-> Alter << '\ n'; }
HINWEIS: std::any
erfordert, dass der Typ kopierenkonstruktierbar ist. Move-Nur-Move-Typen (wie std::unique_ptr
) funktioniert nicht, es sei denn, eingewickelt (siehe unten).
6. Einschr?nkungen und Problemumgehungen
- KEINE MOVE-Nur-Move-Typen direkt :
std::any
Bedürfnisse Urheberrecht. Sie k?nnen jedoch nur Bewegungstypen in einemstd::unique_ptr
einwickeln:
std :: Any Wrapper = std :: Unique_ptr <int> (New int (42)); if (auto* ptr = std :: Any_Cast <std :: Unique_ptr <int >> (& wradeper)) { std :: cout << "Wert:" << ** ptr << '\ n'; }
Leistungskosten : Typl?re und dynamische Zuordnung (für gr??ere Typen) k?nnen Overhead hinzufügen. Vermeiden Sie
std::any
Wenn m?glich, leistungskritische Wege.Keine impliziten Konvertierungen : Auch
int
zudouble
fehlschl?gen. Sie müssen den genauen gespeicherten Typ extrahieren.
7. Praktisches Beispiel: Heterogener Beh?lter
#include <Vector> #Include <Nod> #include <string> #include <iostream> int main () { std :: vector <std :: any> values ??= {1, "text", 3.14, std :: string ("Hallo")}; für (const auto & v: Werte) { if (v.type () == typeId (int)) { std :: cout << "int:" << std :: Any_Cast <int> (v) << '\ n'; } else if (v.type () == typeId (const char*)) { std :: cout << "char*:" << std :: Any_Cast <const char*> (v) << '\ n'; } else if (v.type () == typeId (doppelt)) { std :: cout << "double:" << std :: Any_Cast <Double> (v) << '\ n'; } else if (v.type () == Typid (std :: string)) { std :: cout << "String:" << std :: Any_Cast <Std :: String> (v) << '\ n'; } } }
Hinweis: String -Literale sind const char*
, nicht std::string
, also sei vorsichtig.
Grunds?tzlich ist std::any
eine Typ-Sicherheit-Gewerkschaft, wenn Sie Flexibilit?t ben?tigen. Verwenden Sie es, wenn Sie verschiedene Typen in derselben Variablen oder im gleichen Container speichern müssen, aber immer die Typen vor dem Gie?en überprüfen. Es ist kein Ersatz für Vorlagen oder Polymorphismus, sondern ein Werkzeug für bestimmte dynamische Szenarien.
Das obige ist der detaillierte Inhalt vonWie man mit std :: any in c arbeitet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Stock Market GPT
KI-gestützte Anlageforschung für intelligentere Entscheidungen

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Installac Compiler Likeg usepackAGeMaRaGerSordie-EntwicklungentoolsDendontheos.2.Writeac Programandsaveitwitha.Cppextesion

Der benutzerdefinierte Allocator kann verwendet werden, um das Speicherzuweisungsverhalten von C -Containern zu steuern. 1. Der Loggingallocator im Beispiel implementiert die Speicherbetriebsprotokollierung durch überlastung, Zuordnung, Deallocation, Konstruktion und Zerst?rung von Methoden; 2. Der Allocator muss Value_Type und Wiederherstellungsvorlagen definieren, um die Umwandlungsanforderungen des STL -Containertyps zu erfüllen. 3. Die Allokatorin l?st die Protokollausgabe w?hrend der Konstruktion und Kopie aus, was für die Verfolgung des Lebenszyklus geeignet ist. 4. Die tats?chlichen Anwendungen umfassen Speicherpools, gemeinsamer Speicher, Debugging -Tools und eingebettete Systeme. 5. Seit c 17 kann konstruieren und zerst?ren k?nnen standardm??ig von std :: allocator_traits verarbeitet werden

Verwenden Sie die Funktion STD :: System (), um Systembefehle auszuführen, die Header-Dateien einbeziehen und in C-Style-Befehle wie STD :: System ("LS-L") eingeben müssen, und der Rückgabewert ist -1, was bedeutet, dass der Befehlsprozessor nicht verfügbar ist.

Die Antwort besteht darin, eine Klasse zu definieren, die den erforderlichen Alias ??und Operationen enth?lt. Setzen Sie zun?chst Value_Type, Referenz, Zeiger, Differenz_Type und Iterator_Category, und implementieren Sie dann Dereferenz-, Inkrement- und Vergleichsvorg?nge. Geben Sie schlie?lich die Methoden von Beginn () und End () im Container zur Rückgabe der Iteratorinstanz an, sodass sie mit STL -Algorithmen und Reichweite für Schleifen kompatibel ist.

AstaticVariableInc intainssitesValuebetweenFunctionCallsandisinitializedonce.2.Insieafunction, ItpreservesTateAcrosscalls, SHOSCOUNTINGITIONATIONEN.3.Inacklass, itissharedamongallinstances und mustdefinedEdetheclasstoAwidaVoidlink -Linksverknüpfungstropfen

Echtzeit-Systeme erfordern deterministische Antworten, da die Korrektheit von der Ergebnisabgabedauer abh?ngt. Harte Echtzeitsysteme erfordern strenge Fristen, verpasste werden zu Katastrophen führen, w?hrend weiche Echtzeit gelegentliche Verz?gerungen erm?glicht. Nichtdeterministische Faktoren wie Planung, Interrupts, Caches, Speichermanagement usw. wirken sich auf den Zeitpunkt aus. Der Bauplan umfasst die Auswahl von RTOs, WCET -Analyse, Ressourcenmanagement, Hardwareoptimierung und strengen Tests.

Verwenden Sie STD :: IfStream und Std :: istreambuf_iterator, um den gesamten Inhalt der Datei effizient an Zeichenfolgen, einschlie?lich Leerzeichen und Zeilenpausen, effizient zu lesen, und eignet sich für mittelgro?e Textdateien.

STD :: Array ist ein Container, der Arrays mit fester Gr??e in C sowohl mit Sicherheit als auch mit Leistung zusammenfasst. Es muss Header -Dateien enthalten und sichere Zugriffsmethoden wie Operator [], AT () usw. unterstützt und Mitgliederfunktionen wie Size (), Fill () bereitstellt und die Reichweite für die Schleifenquelle verwenden, um Zeigerabbau zu vermeiden und die Klarheit und Sicherheit der Code zu verbessern.
