2012-05-17 14 views
6

Ich konnte nichts im Internet finden, also suche ich jemanden mit den Einsichten in die Art, wie C++/CX implementiert ist. Die Wikipedia article on C++/CX besagt, dass es Laufzeit-basierte Generics unterstützt, was bedeuten würde, dass Sie eine Headerdatei mit vollständiger Implementierung nicht benötigen, um einen generischen Typ zu instanziieren. Ich verstehe, wie dies für .NET funktioniert (Assemblys enthalten IL-Code und JIT kann einfach betonierte Typen einfügen und kompilieren, wenn eine neue Instanziierung stattfindet), aber in C++/CX (das nativ kompiliert wird) gibt es kein JIT zum Editieren der Code zur Laufzeit (was ich für x86 machine code wäre ziemlich hart)Wie Generika in C++/CX funktionieren

Also was ist der Trick hier, ist es Typ löschen mit Boxen oder ein neues erfundenes Schema?

(Ich weiß, dass die Metadaten über Typen in .NET-Format gespeichert werden, ich bin nach dem Code in den Methoden)

+5

Riecht wie Java's "Lass uns alles in Objekt und dann wieder zurück" Ansatz für Generika. –

+0

würde ein Laufzeit-basiertes Generic sein. C++ 's generische Art Löschen ist boost :: any, aber Sie sollten Runtime-Generics nicht tun, wenn Sie nicht müssen, und die meisten Menschen müssen nie. Verwenden Sie stattdessen Vorlagen. –

+2

Ich denke, es ist eine Kompilierzeit Sache. Wenn eine Initiierung aufgetreten ist, wie "MyTemplate obj;", generiert der Compiler eine Kopie der konkreten Klassendefinition unter Verwendung von "MyTemplate" und "RealType" und verwendet sie dann zum Erstellen des Objekts. Es gibt keine Template-Sache nach der Kompilierung. – Lyn

Antwort

3

in diesem Artikel sucht hier der Hinweis auf Generika in der letzten Zeile gibt an, dass Generika in C++/CX mit Schnittstellen und Delegaten verwendet.

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

Dies macht Sinn, weil, da sie als eine Schnittstelle definiert, die die C++/CX-Compiler nativen Code Funktionen für die eigentlichen Objekte kompilieren können, und dann generische Schnittstellen in ähnlicher Weise wie C++ Vorlagen verwenden. Der native Code für die Funktionen wird kompiliert und die generische Schnittstelle wird verwendet, um mit den verschiedenen Typen zu arbeiten.

Für den Compiler scheint dies der Unterschied zwischen C++/CLR und C++/CX zu sein. /clr: Generics Klassen, Schnittstellen & Delegierten erlaubt. /ZW: Generische Schnittstellen & Delegierten nur.

Wenn Sie hier klicken http://msdn.microsoft.com/en-us/library/windows/apps/hh699870(v=vs.110).aspx werden Sie feststellen, dass es keine generischen Regeln für die Klassen gibt.

Aber wenn Sie dieses Thema lesen http://msdn.microsoft.com/en-us/library/windows/apps/hh755792(v=vs.110).aspx werden Sie feststellen, dass die Generika als Schnittstellen angewendet werden.

Eine "generische Klasse" in C++/CX wird durch Verwendung von Standard-C++ - Vorlagen erreicht. Die Instanziierung oder der vom Compiler erzeugte generische Typ wird in die Metadaten exportiert, nicht aber in die Vorlage selbst. Daher können Sie eine MyClass und eine MyClass aus den Metadaten, aber nicht aus der ursprünglichen MyClass sehen. Dies gilt nicht für den generischen Schnittstellenkoffer, der als generischer Typ in Metadaten exportiert wird.

Weitere Informationen zu diesem Thema finden Sie hier http://en.wikipedia.org/wiki/Windows_Runtime

So voll, die Frage zu beantworten, wie diese Zeit ist der Code in den Methoden vorkompilierte nativen Code in dem Ausgabe-DLL oder EXE und an tatsächlichen nicht angebracht generische Klassen. ABER der Code kann generisch verwendet werden, indem generische Schnittstellen benutzt werden. Also können zehn verschiedene Klassen IMyInterface implementieren, und dann kann eine Variable vom Typ IMyInterface verwendet werden, um beispielsweise mit Instanzen der zehn verschiedenen Typen zu arbeiten.

Also die kurze Antwort ist, es gibt nichts wie vollständige generische Klassen in C++/CX, wie es in C++/CLR gibt. Verwenden Sie Vorlagen für den gleichen Effekt in C++/CX-Anwendungen. Wenn Sie C++ - Generics benötigen, verwenden Sie eine DLL, die mit C++/CLI erstellt wurde, und führen Sie diesen Code aus einem Programm aus, das als C++/CX kompiliert wurde.

Hinweis! Ich habe so viel von der Untersuchung verschiedener Artikel erfahren, und einige von ihnen bei msdn scheinen zu sagen, dass sie sich ändern könnten.

Nun, die generischen Schnittstellen in C++/CX mit Vorlagen zu verwenden ist wahrscheinlich, was sie beabsichtigen. Sie erstellen also eine Vorlage namens MyClass und implementieren dann Ihre generische Schnittstelle MyInterface. Wenn Sie dann eine MyClass-Vorlageninstanziierung erstellt haben, implementiert der neue Typ automatisch MyInterface, und diese Schnittstelle kann dann überall verwendet werden. Außerhalb der kompilierten DLL und der Header-Dateien können andere C++/CX-Module und -Dateien mit Typen wie MyInterface arbeiten, ohne die Header-Datei zu benötigen, da die Template-Instanziierung innerhalb der kompilierten DLL erfolgte, aber eine C++ - Datei mit den Metadaten weiß Mache den MyInterface-Typ, weil er die Metadaten für MyInterface enthält, aber nicht die Metadaten für die MyClass.

In sehr kurzen gibt es keine generischen Klassen und die generische Schnittstelle und Delegate-Unterstützung in C++/CX ist alles, was tatsächlich funktioniert wie Generika in C++/CLI.

+2

Denken Sie daran, dass C++/CX nicht mit C++/CLI identisch ist - die Windows-Laufzeit ist nicht die gleiche wie die CLR und es gibt Funktionen in der CLR, die von Winrt nicht unterstützt werden. Sie können nicht davon ausgehen, dass die CLR-Funktionalität in einer C++/CX-Winrt-Anwendung funktioniert. –

3

Soweit ich weiß, werden beliebige C++/CX Generics nicht unterstützt. C++/CX kann parametrisierte winrt-Schnittstellen verwenden, die als C++ - Vorlagenspezialisierungen angezeigt werden, aber beliebige Generika können nicht exportiert werden.

Sie können Spezialisierungen parametrisierter Schnittstellen aus dem Windows :: Foundation-Namespace erstellen, jedoch nicht die ursprünglichen parametrisierten Schnittstellen (öffentliche Referenzschablonen).

+0

Ja, der zweite Absatz ist wahr. –