26
#helloWindows10 Hel10 Windows 10!

#helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer [email protected] ¿Universales en C++? ¿Y sin

Embed Size (px)

Citation preview

Page 1: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#helloWindows10

 Hel10 Windows 10!

Page 2: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#helloWindows10

Rafael OntiveroWW+D: World Wide C++ Developer [email protected]

¿Universales en C++? ¿Y sin punteros?

Page 3: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin
Page 4: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 5: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#helloWindows10

C++ Developer

Rafael Ontivero aka RFOG

Page 6: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#helloWindows10

¿Difícil C++?

Page 7: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 8: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 9: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 10: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 11: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 12: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 13: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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?

Page 14: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 15: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 16: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#helloWindows10

C++/CX

Page 17: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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?

Page 18: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 19: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 20: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 21: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#helloWindows10

Universales con C++ … /CX

Page 22: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 23: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 24: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#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

Page 25: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#helloWindows10

Q&A

http://aka.ms/W10Ev13

Que sean sencillitas, ¿eh?

Page 26: #helloWindows10 Hel10 Windows 10!. #helloWindows10 Rafael Ontivero WW+D: World Wide C++ Developer rafael.Ontivero@gmail.com ¿Universales en C++? ¿Y sin

#helloWindows10

No olvides realizar la encuesta

¡Gracias!

Rafael OntiveroWW+D: World Wide C++ Developer [email protected]

http://aka.ms/W10Ev13