# C++/CX

C++/CX (estensioni dei componenti) è un'estensione di linguaggio per i compilatori C++ di Microsoft che consente ai programmatori C++ di scrivere programmi per la piattaforma Windows Runtime o API WinRT.
Le estensioni del linguaggio prendono in prestito la sintassi da C ++ / CLI ma indirizzano il codice nativo di Windows Runtime Universal Windows Platform invece del Common Language Runtime e del codice gestito. Porta un insieme di sintassi e astrazioni di libreria che proiettano il modello di programmazione WinRT basato su subset WRL di COM in un modo intuitivo ai coder delle estensioni gestite C ++ / CLI.
È possibile richiamare Windows Runtime da ISO C ++ nativo tramite la libreria di modelli C ++ di Windows Runtime di livello inferiore (WRL).
Sintassi dell'estensione C ++ / CX introduce estensioni di sintassi per la programmazione per Windows Runtime. La sintassi generale non specifica per piattaforma è compatibile con lo standard C ++ 11.

## Objects

Gli oggetti WinRT vengono creati, o attivati, usando ref nuovo e assegnati alle variabili dichiarate con la notazione ^ (hat) ereditata da C ++ / CLI.
Foo ^ foo = ref new Foo;
Una variabile WinRT è semplicemente una coppia di puntatori alla tabella del metodo virtuale e puntatore ai dati interni dell'oggetto.

### Conteggio di riferimento

Un oggetto WinRT è conteggiato con riferimento e quindi si comporta in modo simile agli ordinari oggetti C ++ racchiusi in shared_ptrs. Un oggetto verrà cancellato quando non ci sono riferimenti rimanenti che lo portano.
Non è prevista la raccolta dei rifiuti. Tuttavia, la parola chiave gcnew è stata riservata per un possibile uso futuro.

## ClassesEditRuntime classes

Esistono tipi speciali di classi runtime che possono contenere costrutti di estensione dei componenti. Queste sono semplicemente chiamate classi di riferimento perché sono dichiarate usando la classe ref. classe pubblica ref MyClass;

### Classi parziali

C ++ / CX introduce il concetto di classi parziali. La funzionalità consente di dividere una singola classe su più file, principalmente per abilitare gli strumenti di progettazione dell'interfaccia utente grafica XAML per generare automaticamente il codice in un file separato, al fine di non interrompere la logica scritta dallo sviluppatore. Le parti sono successivamente unite alla compilazione.
I linguaggi .NET come C # hanno questa caratteristica da molti anni. Le classi parziali non sono ancora state convertite nello standard C ++ e non possono quindi essere utilizzate in puro C ++ 11.
Un file che viene generato e aggiornato dal progettista della GUI e che pertanto non dovrebbe essere modificato dal programmatore. Nota la parola chiave partial.
// foo.private.h #pragma una volta ref refo parziale {private: int id_; Platform :: String ^ name_; };
Il file in cui il programmatore scrive la logica dell'interfaccia utente. L'intestazione in cui viene definita la parte generata dalla compilazione della classe viene importata. Si noti che la parola chiave partial non è necessaria.
// foo.public.h #pragma once #include "foo.private.h" ref class foo {public: int GetId; Platform :: String ^ GetName; };
Questo è il file in cui sono implementati i membri della classe parziale.
// foo.cpp #include "pch.h" #include "foo.public.h" int foo :: GetId {return id_;} Platform :: String ^ foo :: GetName {return name_;}

## Generics

Windows Runtime e quindi C ++ / CX supportano i generici basati sul runtime. Le informazioni di tipo generico sono contenute nei metadati e istanziate in fase di runtime, diversamente dai modelli C ++ che sono costrutti in fase di compilazione. Entrambi sono supportati dal compilatore e possono essere combinati.
generico <typename T> public class class bag {property T Item; };

## MetadataVedi anche: Metadata (CLI)

Tutti i programmi WinRT espongono le loro classi e membri dichiarati attraverso i metadati. Il formato è lo stesso standardizzato come parte della Common Language Infrastructure (CLI), lo standard creato da .NET Framework. Per questo motivo, il codice può essere condiviso tra C ++ / CX, linguaggi CLI e JavaScript che si rivolgono a Windows Runtime.

## Libreria di runtime

Il C ++ / CX ha un set di librerie che hanno come target Windows Runtime. Questi aiutano a collegare le funzionalità della libreria standard C ++ e WinRT.
Rilevamento basato su preprocessore
È possibile rilevare se l'estensione C ++ / CX è attivata testando l'esistenza del simbolo del preprocessore __cplusplus_winrt.
#ifdef __cplusplus_winrt // Il codice specifico C ++ / CX va qui ... #endif