2012-05-17 21 views
6

Non ho trovato nulla su questo su Internet, quindi sto cercando qualcuno con le intuizioni sul modo in cui C++/CX è ostacolato. Il Wikipedia article su C++/CX afferma che supporta i generici basati sul runtime, il che implicherebbe che non è necessario un file di intestazione con implementazione completa per creare un'istanza di un tipo generico. Capisco come funziona per .NET (gli assembly contengono il codice IL e JIT può semplicemente inserirvi tipi concreti e compilarlo ogni volta che c'è una nuova istanziazione), ma in C++/CX (che è compilato in modo nativo) non c'è JIT per modificare il codice in fase di runtime (che io asume sarebbe piuttosto difficile per il codice macchina x86)Come funzionano i generici in C++/CX

Quindi qual è il trucco qui, è la cancellazione di tipo con la boxe o qualche nuovo schema inventato?

(so che i metadati sui tipi vengono memorizzati in formato .NET, sono dopo il codice nei metodi)

+5

Odora l'approccio di Java "gettiamo tutto in Oggetto e poi di nuovo" ai generici. –

+0

sarebbe un generico basato sul runtime. La cancellazione di tipo generico di C++ è boost :: any, ma non dovresti fare generici di runtime se non devi, e la maggior parte delle persone non deve mai farlo. Utilizza invece i modelli. –

+2

Penso che sia una cosa a tempo di compilazione. Quando è stata riscontrata un'iniziazione, come "MyTemplate obj;", il compilatore genera una copia della definizione di classe concreta utilizzando "MyTemplate" e "RealType", quindi la utilizza per creare l'oggetto. Non c'è una cosa modello dopo la compilazione. – Lyn

risposta

3

Guardando a questo articolo qui il riferimento a generici sull'ultima riga specifica che i generici sono utilizzato in C++/CX con interfacce e delegati.

http://msdn.microsoft.com/en-us/library/windows/apps/br212455(v=vs.110).aspx

questo senso perché essendo definita come un'interfaccia che consente l'++/CX compilatore C per compilare funzioni di codice nativo per gli oggetti reali, e quindi utilizzare interfacce generiche in modo simile ai modelli C++. Il codice nativo per le funzioni è compilato e l'interfaccia generica viene utilizzata per lavorare con i diversi tipi.

Per il compilatore sembra che questa sia la differenza tra C++/CLR e C++/CX. /clr: Classi generiche, interfacce & delegati consentiti. /ZW: interfacce generiche solo & delegati.

Se guardate qui http://msdn.microsoft.com/en-us/library/windows/apps/hh699870(v=vs.110).aspx noterete che non ci sono regole generiche per le classi.

Ma se leggi questo argomento http://msdn.microsoft.com/en-us/library/windows/apps/hh755792(v=vs.110).aspx noterai che i generici vengono applicati come interfacce.

Una "classe generica" ​​in C++/CX viene ottenuta utilizzando modelli standard C++. L'istanziazione o il compilatore generato tipo specifico del generico viene esportato nei metadati, ma non nel modello stesso. Così puoi vedere una MyClass e una MyClass dai metadati, ma non dalla MyClass originale. Questo non è vero per il caso dell'interfaccia generico che viene esportato nei metadati come tipo generico.

Ulteriori informazioni su questo può essere trovato qui http://en.wikipedia.org/wiki/Windows_Runtime

Quindi, per rispondere pienamente alla domanda, a partire da questo momento, il codice nei metodi è il codice nativo precompilato nella DLL di output o exe ed è collegata a non reale classi generiche. MA il codice può essere utilizzato genericamente utilizzando interfacce generiche. Quindi dieci diverse classi possono implementare IMyInterface e quindi una variabile di tipo IMyInterface può essere utilizzata per lavorare con istanze dei dieci diversi tipi, ad esempio.

Quindi la risposta breve è che non c'è niente come le classi generiche complete in C++/CX come in C++/CLR. Usa modelli per lo stesso effetto in applicazioni C++/CX. Se è necessario disporre di generici C++, utilizzare una dll creata con C++/CLI e lavorare quel codice da un programma compilato come C++/CX.

Nota! Ho dedotto molto dall'esame di vari articoli e alcuni di loro su msdn sembrano dire che potrebbero essere soggetti a modifiche.

Ora utilizzare le interfacce generiche in C++/CX con i modelli è probabilmente ciò che intendono. Quindi crei un modello chiamato MyClass e quindi implementa la tua interfaccia generica chiamata MyInterface, quindi se hai creato un'istanza di template MyClass, il nuovo tipo implementerà automaticamente MyInterface e questa interfaccia potrà quindi essere utilizzata ovunque. Quindi, al di fuori della dll compilata e dei file di intestazione, altri moduli e file C++/CX possono funzionare con tipi come MyInterface senza bisogno del file di intestazione, perché l'istanza del modello era all'interno della dll compilata, ma un file C++ che utilizza i metadati sa come crea il tipo MyInterface perché ha i metadati per MyInterface, ma non i metadati per MyClass.

In breve non ci sono classi generiche e l'interfaccia generica e il supporto delegato in C++/CX è tutto ciò che in realtà funziona come generici in C++/CLI.

+2

Ricorda che C++/CX non è lo stesso di C++/CLI - il runtime di Windows non è lo stesso di CLR e c'è funzionalità nel CLR che non è supportato da winrt. Non si può presumere che la funzionalità CLR funzioni in un'applicazione C++/CX winrt –

3

Per quanto ne so, i generici C++/CX generici non sono supportati. C++/CX può utilizzare interfacce parametrizzate winrt, che appaiono come specializzazioni di template C++, ma i generici arbitrari non possono essere esportati.

È possibile creare specializzazioni di interfacce parametriche dallo spazio dei nomi di Windows :: Foundation, ma non dalle interfacce parametriche originali (modelli di riferimento pubblico).

+0

Sì, il secondo paragrafo è vero. –