Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Template metaprogramming 101 
Desmitificando la metaprogramación en C++ 
Manu Sánchez @Manu343726, Oct 2014
“Modern C++” 
● La mayoría de la industria todavía depende 
de e incluso desarrolla en C++98/03. El 
eterno problema del l...
Modern C++ facts
Los compiladores 
● Hace mucho tiempo que un compilador dejó 
de ser un traductor de lenguaje de alto nivel 
a ensamblador...
Los compiladores 
● Hoy en día es muy difícil optimizar a mano: 
Arquitecturas y lenguajes muy complejos. 
Pero -O3 lo hac...
Los compiladores 
● Moraleja: Bajo nivel != eficiencia. Para la 
mayoría de los seres humanos bajo nivel == 
ineficiencia....
El lenguaje 
● C++11 se siente como un nuevo y mejor 
lenguaje. C++14 arregla y mejora bastantes 
cosas. ¡Estoy deseando v...
El lenguaje 
● Algunos argumentan que el lenguaje cada 
vez es más complicado. A nivel de “friki” es 
cierto, pero a nivel...
Metaprogramación
Metaprogramación 
● Generación contra duplicado de código. 
● Automatización de la generación de código. 
● Menos código =...
Metaprogramación en C++ 
● El sistema de plantillas de C++ es Turing 
Completo. Te ha quedado muy chula la 
frase, ¿pero e...
Metaprogramación en C++ 
● ¿Pero cómo es posible? Hay algo que 
tienen las plantillas y no los genéricos: 
Especialización...
Metaprogramación en C++ 
● Hasta ahora todo ha sonado muy bien, ¿por 
qué la gente le suele tener tanto miedo y 
acaba pon...
Metaprogramación en C++ 
● Hasta ahora todo ha sonado muy bien, ¿por 
qué la gente le suele tener tanto miedo y 
acaba pon...
Metaprogramación en C++ 
● Seamos sinceros, el lenguaje no estaba 
diseñado para hacer ésto, por mucho que 
recientes añad...
Metaprogramación en C++: Pitfalls 
● typename ::type 
● <><<<>>>><><<<>>>::<<<>>>::<><> 
● template<template<typename> cla...
Metaprogramación en C++: Pitfalls 
● Esos mensajes de error tan cortos y que 
siempre van al grano. 
● Compiladores como C...
Metaprogramación en C++: Pitfalls 
● Mi consejo: Lee la primera línea, olvídate del 
resto. Los errores suelen ir en casca...
Metaprogramación en C++: Pitfalls 
● Rendimiento: Suele ser bastante malo, 
consume un montón de recursos, y es 
altamente...
Metaprogramación en C++ 
● Pero cuando funciona...
Compile-time computing
Cálculo en tiempo de compilación 
● ¿Qué significa hacer cálculos en tiempo de 
compilación? 
● Significa que no quiero qu...
Cálculo en tiempo de compilación 
● ¿Y qué pasa con constexpr? Una 
herramienta más. Mejor para unos casos y 
peor para ot...
Generación y 
manipulación de tipos 
(y su código subyacente)
Generación y manipulación de tipos 
● Ya que estamos utilizando un sistema de 
generación de tipos, juguemos con tipos. 
●...
Typelists 
● Como su nombre indica, son “listas” cuyos 
elementos son tipos. 
● Muy fáciles de implementar gracias a las 
...
Metafunciones 
● Por “metafunción” se entiende una función 
que manipula y devuelve tipos. 
● En el caso de tmp, normalmen...
Metafunciones 
● En éste sentido, los type traits que provee la 
biblioteca estándar desde C++11 pueden 
entenderse como m...
Metaprogramación de alto 
nivel
Metafunciones de alto nivel 
● Haskell, otra vez 
● foldl, foldr, filter, map, etc 
● Variadic templates: O(1) map, wow!
Evaluación uniforme de expresiones 
● tyename ::type es totalmente ilegible y 
escala pobremente. 
● Mi propuesta: tml::ev...
Evaluación uniforme de expresiones 
● tml::eval es una metafunción que dada una 
expresión la evalua convenientemente. 
● ...
Evaluación uniforme de expresiones 
● tml::eval<std::remove_reference<std:: 
remove_const<const int&>>; 
● tml::eval<tml::...
¿Preguntas?
Template metaprogramming 101: Desmystifying C++ metaprogramming
Nächste SlideShare
Wird geladen in …5
×

Template metaprogramming 101: Desmystifying C++ metaprogramming

Slides from the first Template Metaprogramming 101 talk from Meeting C/C++ Madrid. http://www.meetup.com/Madrid-C-Cpp/events/205900412/

  • Loggen Sie sich ein, um Kommentare anzuzeigen.

  • Gehören Sie zu den Ersten, denen das gefällt!

Template metaprogramming 101: Desmystifying C++ metaprogramming

  1. 1. Template metaprogramming 101 Desmitificando la metaprogramación en C++ Manu Sánchez @Manu343726, Oct 2014
  2. 2. “Modern C++” ● La mayoría de la industria todavía depende de e incluso desarrolla en C++98/03. El eterno problema del legacy code. ● No, no me refiero a Alexandrescu. “Modern C++” es una forma de diferenciar dicho legacy code del state of the art C++, C++11/14.
  3. 3. Modern C++ facts
  4. 4. Los compiladores ● Hace mucho tiempo que un compilador dejó de ser un traductor de lenguaje de alto nivel a ensamblador. ● En los últimos veinte años ha habido una evolución increíble en el desarrollo e implementación de compiladores.
  5. 5. Los compiladores ● Hoy en día es muy difícil optimizar a mano: Arquitecturas y lenguajes muy complejos. Pero -O3 lo hace muy bien por nosotros. ● Trabajar en ensamblador por eficiencia ya no tiene ningún sentido (Salvo casos muy concretos. ¿Fixed-point? ¿ISRs?).
  6. 6. Los compiladores ● Moraleja: Bajo nivel != eficiencia. Para la mayoría de los seres humanos bajo nivel == ineficiencia. ● Optimiza algoritmos y arquitectura del programa. Evita microoptimizaciones.
  7. 7. El lenguaje ● C++11 se siente como un nuevo y mejor lenguaje. C++14 arregla y mejora bastantes cosas. ¡Estoy deseando ver C++17! ● La mayoría de las “pifias” que uno tenía que hacer ya no son necesarias > >... ;) ● La programación en alto nivel y genérica con C++ es sencilla y natural. Java no es de alto nivel por Dios… std::copy()
  8. 8. El lenguaje ● Algunos argumentan que el lenguaje cada vez es más complicado. A nivel de “friki” es cierto, pero a nivel de usuario es bastante más sencillo: Nada de The Rule Of Five, The Rule Of Zero. ¡std::make_unique()!
  9. 9. Metaprogramación
  10. 10. Metaprogramación ● Generación contra duplicado de código. ● Automatización de la generación de código. ● Menos código == menos código que mantener == menos bugs potenciales.
  11. 11. Metaprogramación en C++ ● El sistema de plantillas de C++ es Turing Completo. Te ha quedado muy chula la frase, ¿pero eso qué demonios significa? ● Significa que tenemos a nuestra disposición un sistema de generación de tipos que es capaz de computar cualquier cosa. Utilicemoslo.
  12. 12. Metaprogramación en C++ ● ¿Pero cómo es posible? Hay algo que tienen las plantillas y no los genéricos: Especialización. Y sobretodo, especialización parcial. ● En otras palabras, pattern matching.
  13. 13. Metaprogramación en C++ ● Hasta ahora todo ha sonado muy bien, ¿por qué la gente le suele tener tanto miedo y acaba poniendo esta cara?
  14. 14. Metaprogramación en C++ ● Hasta ahora todo ha sonado muy bien, ¿por qué la gente le suele tener tanto miedo y acaba poniendo esta cara? ● Muy sencillo: Su sintaxis y los mensajes de error.
  15. 15. Metaprogramación en C++ ● Seamos sinceros, el lenguaje no estaba diseñado para hacer ésto, por mucho que recientes añadidos como las variadic templates o <type_traits> ayuden. ● ¿Cual es el resultado?
  16. 16. Metaprogramación en C++: Pitfalls ● typename ::type ● <><<<>>>><><<<>>>::<<<>>>::<><> ● template<template<typename> class > class ● En resumen: Una sintaxis horrible.
  17. 17. Metaprogramación en C++: Pitfalls ● Esos mensajes de error tan cortos y que siempre van al grano. ● Compiladores como CLang han mejorado bastante en este asunto. Tanto que a veces lo que dice hasta puede llegar a ser útil. ● GCC sigue a lo suyo.
  18. 18. Metaprogramación en C++: Pitfalls ● Mi consejo: Lee la primera línea, olvídate del resto. Los errores suelen ir en cascada. ● Pero no os voy a mentir: Depurar no es nada fácil. static_assert(sizeof(T) != sizeof (T) , “Trace”) y herramientas como templight ayudan muchísimo.
  19. 19. Metaprogramación en C++: Pitfalls ● Rendimiento: Suele ser bastante malo, consume un montón de recursos, y es altamente dependiente del compilador. En algunos ni siquiera funciona, gracias Microsoft por tu maravilloso compilador.
  20. 20. Metaprogramación en C++ ● Pero cuando funciona...
  21. 21. Compile-time computing
  22. 22. Cálculo en tiempo de compilación ● ¿Qué significa hacer cálculos en tiempo de compilación? ● Significa que no quiero que el programa calcule absolutamente nada, quiero el resultado directamente grabado en el ejecutable. Literalmente.
  23. 23. Cálculo en tiempo de compilación ● ¿Y qué pasa con constexpr? Una herramienta más. Mejor para unos casos y peor para otros.
  24. 24. Generación y manipulación de tipos (y su código subyacente)
  25. 25. Generación y manipulación de tipos ● Ya que estamos utilizando un sistema de generación de tipos, juguemos con tipos. ● Multitud de aplicaciones. Policy based designs. Generación de jerarquías. ● Definitivamente Alexandrescu se adelantó a su época.
  26. 26. Typelists ● Como su nombre indica, son “listas” cuyos elementos son tipos. ● Muy fáciles de implementar gracias a las variadic templates.
  27. 27. Metafunciones ● Por “metafunción” se entiende una función que manipula y devuelve tipos. ● En el caso de tmp, normalmente son plantillas que “devuelven” un resultado a través de un tipo miembro público. ::type en la biblioteca estándar, ::result en mi Turbo.
  28. 28. Metafunciones ● En éste sentido, los type traits que provee la biblioteca estándar desde C++11 pueden entenderse como metafunciones. ● std::remove_const por ejemplo: Dado un tipo, lo devuelve sin su cualificador const superior. Es decir: remove_const(const int) - > int.
  29. 29. Metaprogramación de alto nivel
  30. 30. Metafunciones de alto nivel ● Haskell, otra vez ● foldl, foldr, filter, map, etc ● Variadic templates: O(1) map, wow!
  31. 31. Evaluación uniforme de expresiones ● tyename ::type es totalmente ilegible y escala pobremente. ● Mi propuesta: tml::eval
  32. 32. Evaluación uniforme de expresiones ● tml::eval es una metafunción que dada una expresión la evalua convenientemente. ● Una expresión puede ser: Un valor (tipo) simple: int, char, bool Una expresión compuesta: std::vector<int> Una metafunción: std::remove_const<int>
  33. 33. Evaluación uniforme de expresiones ● tml::eval<std::remove_reference<std:: remove_const<const int&>>; ● tml::eval<tml::add<tml::Int<2>,tml::add<tml:: Int<3>,tml::Int<5>>>>;
  34. 34. ¿Preguntas?

×