Upload
roberto-luna-montoya
View
217
Download
0
Embed Size (px)
Citation preview
#helloWindows10
Hel10 Windows 10!
#helloWindows10
Rafael OntiveroWW+D: World Wide C++ Developer [email protected]
¿Universales en C++? ¿Y sin punteros?
#helloWindows10
¿Realmente es C++ tan difícil?Código obsoleto y ofuscadoEjemplos de código moderno
C++/CX. ¿Otra variante de C++?Un resumen ultra rápido de lo que es
Universales con C++La librería de ejemploEnvolviendo el códigoLa aplicación final
El código está aquí:https://bitbucket.org/rfog/hel10_world
Agenda
#helloWindows10
C++ Developer
Rafael Ontivero aka RFOG
#helloWindows10
¿Difícil C++?
#helloWindows10
• int * (*(*fp) (int**, char*))[10];• int *(*(*arr[5])())();• void ** (*d) (int &, char **(*)(char *, char **));• void **Complicadissssimo(void *algo, void ***masComplejo) {…};
• int sum = (N & (N % 2 ? 0 : ~0) | (((N & 2) >> 1) ^ (N & 1)));
• int srtcpy(char *dst, char const *src){
int count = 0;while (*dst++ = *src++)
count++;return count;
}
Algunos ejemplos
#helloWindows10
• int mymax(int(*a)(int(*)(int(*)()), int(*)(int(*)(int**))),int(*b)(int(*)(int(*)()), int*, int(*)(int(*)())))
{ return (int)((((int(*)(int(*)(int(*)()), int(*)(int(*)
())))a) > ((int(*)(int(*)(int(*)()), int(*)(int(*)())))b)) ? ((int(*)(int(*)(int(*)()), int(*)(int(*)())))a) : ((int(*)(int(*)(int(*)()), int(*)(int(*)())))b));
};
Otro ejemplos de código raruno
#helloWindows10
(O usar lo menos posible)• Funciones estilo printf (luego veremos su reemplazo. No, no son los
streams)• Cadenas de C (strcpy, strcat, …)• Punteros desnudos• Menear punteros de acá para allá• Tipos complejos desnudos• En general, construcciones típicas de C• (Esto nos lleva a no aprender primero C y luego C++)
Cosas que no deberíamos usar
#helloWindows10
1.- ReferenciasLa referencia es como un puntero pero sin puntero
A todos los efectos es un alias de la variable originalTiene algunas limitaciones, como que no se puede debe devolver en una llamada a funciónSe deben inicializar en la declaración• Ejemplo 1: Un strcpy con referencias• Ejemplo 2: Un strcpy como dios manda
Ejemplos de código moderno
#helloWindows10
2.- Semántica de movimientoCopiar algo complejo es muy caro. ¿Y si simplemente lo movemos?• Con std::move es lo más fácil• También podemos crear nuestros propios tipos que se puedan mover mediante• Constructor de movimiento• Operador de asignación que mueve
Cosas chulas que indirectamente vienen de la semántica de movimiento:Clase que no se puede construirClase que no se puede copiarClase que no se puede asignar
Ejemplos de código moderno
#helloWindows10
3.- Autopunteros o punteros inteligentesControlan el tiempo de vida del objeto contenido, destruyéndolo cuando el propio puntero sale de ámbito -> No más fugas de memoria.unique_ptr• Sólo puede haber un propietario• Si se construyen con make_unique no se pueden tranferir
shared_ptr• Puede haber varios propietarios• Cuando el último propietario sale de ámbito, se libera el contenido.
Extra: nullptr
Ejemplos de código moderno
#helloWindows10
4.- Variadic TemplatesLos variadic templates son plantillas que toman un número indeterminado de argumentos.
¿Un printf seguro en cuanto a tipos? ¿Y al estilo de .NET?:StringHelper
Ejemplos de código moderno
4.- for each / rangeEs equivalente al foreach de C#, pero válido para aquellos elementos que tengan iteradores y/o arrays.
Podemos modificar los elementos de la colección iterada pero no añadir/quitar¿Chulo el range, eh?
#helloWindows10
5.- Funciones y bindables• Son los punteros a funciones del siglo XXI• Envuelven funciones miembro sin problemas (closures)• std::bind crea un envoltorio para una función• Se puede ejecutar y/o pasar como un parámetro más• También es cierto que como te líes, los mensajes de error del
compilador no te van a ayudar mucho
Ejemplos de código moderno
#helloWindows10
6.- Boost es la leche (I), y encima multiplataforma
¿Necesitas algo? Está en boost. Y con varios sabores y colores.• Números aleatorios• Sockets• Acceso a ficheros• Threading• Sincronización• Tiempo (temporizadores y duraciones)• Estructuras de datos extendidas• Algoritmos extendidos• Matemáticas (álgebra, geometría, estadística, grafos…)• Máquinas de estado• Metamáquinas de estados (máquinas de estados que hacen máquinas de estados)• … nómbralo y lo tengo (http://www.boost.org/doc/libs/)
Ejemplos de código moderno
#helloWindows10
C++/CX
#helloWindows10
• C++/CX son unas extensiones a C++ que permiten cierto sugar syntax
• Permiten interactuar con el API Nativo de las aplicaciones de la tienda• El API nativo se llama WRL, pero hay un envoltorio llamado Component Extensions
• AL final todo es un conjunto de componentes DCOM, OCX o como queráis llamarlos
• (Y sí, las aplicaciones de la tienda son nativas)• El punto de entrada a la documentación de C++/CX está aquí: https://
msdn.microsoft.com/en-us/library/hh699871.aspx• Y la referencia de espacios de nombres aquí: https://
msdn.microsoft.com/en-us/library/hh832106.aspx• Para la interfaz se usa XAML igual que con los otros lenguajes• Se pueden acceder a todos los controles visuales, pero con la sintaxis
de C++/CX
¿Otro C++? ¿Nativo o manejado?
#helloWindows10
• La interfaz pública tiene que cumplir las reglas de la parte CX• La destrucción es determinista• La parte interna puede usar cualquier cosa de C++, STL, BOOST,
Win32, siempre que no se use una llamada Win32 prohibida.• Si se compila con /CLR se obtiene acceso a la parte .NET• Si se puede evitar, mejor: más rendimiento.• Aunque C++/CLI también tiene destrucción determinista
Más cosas interesantes sobre C++/CX
#helloWindows10
Lo más básico de C++/CX
Clases• ref class • value class• interface class
Estructuras• ref struct• value struct• interface struct
Enumeraciones• enum class• enum struct
Otros(Los veremos en el ejemplo complete)
• property• delegate• eventEspecificadores
• abstract• new• override• sealed
#helloWindows10
Más de C++/CX
Genéricos• generic• where
Estructuras• ref struct• value struct• interface struct
Palabras reservadas• Finally• for each / in• ref new• initonly• literal• nullptr
Otros• property• delegate• event
#helloWindows10
Universales con C++ … /CX
#helloWindows10
Dividida en dos partes:MathLib.lib: Una LIB clásica que contiene una clase capaz de• Sumar• Restar• Multiplicar• Dividir
Es tan antigua que usa punteros a void para recibir los parámetros porque acepta enteros, coma flotantes y complejos enteros.
MathDll.dll: Una DLL clásica que envuelve a la anterior.• Envuelve la funcionalidad de MathLib• Ofrece una interfaz C para ser compatible con otros lenguajes• Es tan fea y obsoleta como la anterior.
La biblioteca matemática de alto rendimiento
#helloWindows10
Actualizar para usar en Aplicaciones Universales
Limitaciones• No se puede usar una DLL compilada como nativa (por lo que necesitamos el
código fuente)• Sí que se puede usar una LIB compilada como nativa
Qué hay que hacer para usarlas• Se explica aquí:
https://msdn.microsoft.com/en-us/library/mt186162.aspx#BK_Win32DLL• Si tenemos el código fuente, podremos integrarlo directamente en nuestro código
Opciones:• Transformar la DLL a DLL Universal• Usar un LIB• Crear un Componente Universal (para ser usado también en otros lenguajes• Integrarlo en nuestro código
El envoltorio en C++/CX
#helloWindows10
Nuestra solución pasa por crear un componente que use una DLL Universal a partir del código fuente• Creamos una DLL Universal en C++ (vacía)• Añadimos el código de la DLL nativa• Configuramos algunas rutas• Añadimos la nueva DLL a un Componente Universal (que vale para
otros lenguajes)• Usamos el Componente en nuestra aplicación
Envolviendo el código obsoleto
#helloWindows10
Q&A
http://aka.ms/W10Ev13
Que sean sencillitas, ¿eh?
#helloWindows10
No olvides realizar la encuesta
¡Gracias!
Rafael OntiveroWW+D: World Wide C++ Developer [email protected]
http://aka.ms/W10Ev13