2012-05-17 10 views
6

No pude encontrar nada al respecto en Internet, así que estoy buscando a alguien que conozca la forma en que se C++/CX se impone. El Wikipedia article en C++/CX dice que admite genéricos basados ​​en el tiempo de ejecución, lo que implicaría que no necesita un archivo de encabezado con implementación completa para crear instancias de un tipo genérico. Intento cómo funciona esto para .NET (los ensamblados contienen código IL y JIT puede simplemente insertar tipos concretos en él y compilarlo siempre que haya una nueva instanciación), pero en C++/CX (que se compila de forma nativa) no hay JIT para editar el código en tiempo de ejecución (que supongo que sería bastante difícil para el código de máquina x86)Cómo funcionan los genéricos en C++/CX

¿Cuál es el truco aquí, es tipo borrado con el boxeo o algún nuevo esquema ideado?

(sé que los metadatos acerca de los tipos se almacena en formato de .NET, estoy después de que el código en los métodos)

+5

Huele como el enfoque "vamos a echar todo a Object y luego a volver" de Java a los genéricos. –

+0

un genérico basado en tiempo de ejecución sería. El borrado de tipo genérico de C++ es boost :: any, pero no deberías hacer genéricos en tiempo de ejecución si no tienes que hacerlo, y la mayoría de la gente nunca tiene que hacerlo. Use plantillas en su lugar. –

+2

Creo que es una cosa de tiempo de compilación. Cuando se encuentra una iniciación, como "MyTemplate obj;", el compilador generará una copia de la definición de clase concreta utilizando "MyTemplate" y "RealType", y luego la usará para crear el objeto. No hay nada de plantilla después de la compilación. – Lyn

Respuesta

3

En cuanto a este artículo aquí la referencia a los genéricos en la última fila especifica que los genéricos son utilizado en C++/CX con interfaces y delegados.

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

Esto tiene sentido porque ya que se define como una interfaz que permite al compilador ++/CX C para compilar funciones de código nativo para los objetos reales, y luego usar interfaces genéricas de una manera similar a las plantillas de C++. El código nativo para las funciones se compila y la interfaz genérica se usa para trabajar con los diferentes tipos.

Para el compilador, parece que esta es la diferencia entre C++/CLR y C++/CX. /clr: clases genéricas, interfaces & delegados permitidos. /ZW: interfaces genéricas & delegados solamente.

Si mira aquí http://msdn.microsoft.com/en-us/library/windows/apps/hh699870(v=vs.110).aspx notará que no hay reglas genéricas para las clases.

Pero si lee este tema http://msdn.microsoft.com/en-us/library/windows/apps/hh755792(v=vs.110).aspx notará que los genéricos se aplican como interfaces.

Una "clase genérica" ​​en C++/CX se logra mediante el uso de plantillas estándar de C++. La instanciación o el tipo específico generado por el compilador del genérico se exporta a los metadatos, pero no a la plantilla en sí. Por lo tanto, puede ver una MyClass y una MyClass a partir de los metadatos, pero no la MyClass original. Esto no es cierto para el caso de la interfaz genérica que se exporta a los metadatos como un tipo genérico.

Más información sobre esto se puede encontrar aquí http://en.wikipedia.org/wiki/Windows_Runtime

Así que para responder plenamente a la pregunta, a partir de este momento, el código de los métodos es el código nativo precompilado en el archivo DLL de salida o exe y se une a la no real clases genéricas PERO el código se puede usar genéricamente mediante el uso de interfaces genéricas. Entonces, diez clases diferentes pueden implementar IMyInterface y luego se puede usar una variable de tipo IMyInterface para trabajar con instancias de los diez tipos diferentes, por ejemplo.

Por lo tanto, la respuesta corta es que no hay nada como las clases genéricas completas en C++/CX que hay en C++/CLR. Use plantillas para el mismo efecto en aplicaciones C++/CX. Si debe tener genéricos de C++, utilice un dll creado con C++/CLI y trabaje ese código desde un programa compilado como C++/CX.

Nota! Obtuve mucho de examinar varios artículos y algunos de ellos en msdn parecen decir que podrían estar sujetos a cambios.

Ahora, usar las interfaces genéricas en C++/CX con plantillas es probablemente lo que pretenden. Así que crea una plantilla llamada MyClass y luego implementa su interfaz genérica llamada MyInterface, por lo que si luego creó una instancia de plantilla MyClass, el nuevo tipo implementará MyInterface automáticamente, y esta interfaz se podrá usar en cualquier lugar. Así que fuera del dll compilado y los archivos de cabecera, otros módulos y archivos C++/CX pueden funcionar con tipos como MyInterface sin necesidad del archivo de cabecera, porque la instanciación de la plantilla estaba dentro del dll compilado, pero un archivo C++ que utiliza los metadatos sabe cómo hacer el tipo MyInterface porque tiene los metadatos para MyInterface, pero no los metadatos para MyClass.

En resumen, no hay clases genéricas y la interfaz genérica y el soporte de delegados en C++/CX es todo lo que realmente funciona como genéricos en C++/CLI.

+2

Recuerde que C++/CX no es lo mismo que C++/CLI: el tiempo de ejecución de Windows no es el mismo que el CLR y hay funcionalidad en el CLR que no es compatible con winrt. No puede suponer que la funcionalidad de CLR funcionará en una aplicación winrt de C++/CX –

3

Hasta donde sé, los genéricos C++/CX arbitrarios no son compatibles. C++/CX puede consumir interfaces con parámetros winrt, que aparecen como especializaciones de plantillas de C++, pero no se pueden exportar genéricos arbitrarios.

Puede crear especializaciones de interfaces parametrizadas desde el espacio de nombres Windows :: Foundation, pero no las interfaces con parámetros originales (plantillas de ref públicas).

+0

Sí, el segundo párrafo es verdadero. –

Cuestiones relacionadas