SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
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 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.
Modern C++ facts
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.
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?).
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.
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()
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()!
Metaprogramación
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.
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.
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.
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?
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.
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?
Metaprogramación en C++: Pitfalls 
● typename ::type 
● <><<<>>>><><<<>>>::<<<>>>::<><> 
● template<template<typename> class > class 
● En resumen: Una sintaxis horrible.
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.
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.
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.
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 que el programa 
calcule absolutamente nada, quiero el 
resultado directamente grabado en el 
ejecutable. Literalmente.
Cálculo en tiempo de compilación 
● ¿Y qué pasa con constexpr? Una 
herramienta más. Mejor para unos casos y 
peor para otros.
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. 
● Multitud de aplicaciones. Policy based 
designs. Generación de jerarquías. 
● Definitivamente Alexandrescu se adelantó a 
su época.
Typelists 
● Como su nombre indica, son “listas” cuyos 
elementos son tipos. 
● Muy fáciles de implementar gracias a las 
variadic templates.
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.
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.
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::eval
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>
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>>>>;
¿Preguntas?

Más contenido relacionado

Destacado

Identification de babylone la grande
Identification de babylone la grandeIdentification de babylone la grande
Identification de babylone la grandedaniellamy
 
Learning Expédition LeHack40 pour GRTgaz
Learning Expédition LeHack40 pour GRTgazLearning Expédition LeHack40 pour GRTgaz
Learning Expédition LeHack40 pour GRTgazLeHack40
 
La formation en alternance pour une meilleure réinsertion socio-professionnelle
La formation en alternance pour une meilleure réinsertion socio-professionnelleLa formation en alternance pour une meilleure réinsertion socio-professionnelle
La formation en alternance pour une meilleure réinsertion socio-professionnelleCTB Burundi
 
Les psaumes-traductionlitteraleenfrancais-leboysdesguays-et-harl-aveclessomma...
Les psaumes-traductionlitteraleenfrancais-leboysdesguays-et-harl-aveclessomma...Les psaumes-traductionlitteraleenfrancais-leboysdesguays-et-harl-aveclessomma...
Les psaumes-traductionlitteraleenfrancais-leboysdesguays-et-harl-aveclessomma...daniellamy
 
Dictionnaire grec francais nouveau testament
Dictionnaire grec francais nouveau testamentDictionnaire grec francais nouveau testament
Dictionnaire grec francais nouveau testamentdaniellamy
 
Peintures fernando botero objet de still life - artisoo
Peintures fernando botero objet de still life  - artisooPeintures fernando botero objet de still life  - artisoo
Peintures fernando botero objet de still life - artisooparkupton
 
Le burnout moyens d'action pratiques pour soutenier les personnes en burn out...
Le burnout moyens d'action pratiques pour soutenier les personnes en burn out...Le burnout moyens d'action pratiques pour soutenier les personnes en burn out...
Le burnout moyens d'action pratiques pour soutenier les personnes en burn out...OFO - IFA
 
La Géopolitique du tourisme: Cas de la République centrafricaine.
La Géopolitique du tourisme: Cas de la République centrafricaine.La Géopolitique du tourisme: Cas de la République centrafricaine.
La Géopolitique du tourisme: Cas de la République centrafricaine.Mohcine Boudanes
 
Audika s'implante en belgique
Audika s'implante en belgiqueAudika s'implante en belgique
Audika s'implante en belgiqueAudika8
 
Renouvellement junior association
Renouvellement junior associationRenouvellement junior association
Renouvellement junior associationJA33
 
Guide de formations rija 2011
Guide de formations rija  2011Guide de formations rija  2011
Guide de formations rija 2011sema_asso
 
El nanotransistor una aplicación descriptiva ing. ancizar paredes
El nanotransistor una aplicación descriptiva ing. ancizar paredesEl nanotransistor una aplicación descriptiva ing. ancizar paredes
El nanotransistor una aplicación descriptiva ing. ancizar paredesAncizar Paredes Ardila
 
1er Rendez-Vous E-tourisme à Obernai le 16-05-2013
1er Rendez-Vous E-tourisme à Obernai le 16-05-20131er Rendez-Vous E-tourisme à Obernai le 16-05-2013
1er Rendez-Vous E-tourisme à Obernai le 16-05-2013Tourisme Obernai
 
Actions de service
Actions de serviceActions de service
Actions de serviceMichel6041
 

Destacado (20)

Rallye francophone 2012
Rallye francophone 2012Rallye francophone 2012
Rallye francophone 2012
 
Identification de babylone la grande
Identification de babylone la grandeIdentification de babylone la grande
Identification de babylone la grande
 
Learning Expédition LeHack40 pour GRTgaz
Learning Expédition LeHack40 pour GRTgazLearning Expédition LeHack40 pour GRTgaz
Learning Expédition LeHack40 pour GRTgaz
 
Bilan de mandat 2008-2014
Bilan de mandat 2008-2014Bilan de mandat 2008-2014
Bilan de mandat 2008-2014
 
La formation en alternance pour une meilleure réinsertion socio-professionnelle
La formation en alternance pour une meilleure réinsertion socio-professionnelleLa formation en alternance pour une meilleure réinsertion socio-professionnelle
La formation en alternance pour une meilleure réinsertion socio-professionnelle
 
Les psaumes-traductionlitteraleenfrancais-leboysdesguays-et-harl-aveclessomma...
Les psaumes-traductionlitteraleenfrancais-leboysdesguays-et-harl-aveclessomma...Les psaumes-traductionlitteraleenfrancais-leboysdesguays-et-harl-aveclessomma...
Les psaumes-traductionlitteraleenfrancais-leboysdesguays-et-harl-aveclessomma...
 
Dictionnaire grec francais nouveau testament
Dictionnaire grec francais nouveau testamentDictionnaire grec francais nouveau testament
Dictionnaire grec francais nouveau testament
 
Peintures fernando botero objet de still life - artisoo
Peintures fernando botero objet de still life  - artisooPeintures fernando botero objet de still life  - artisoo
Peintures fernando botero objet de still life - artisoo
 
4phone Cftv
4phone Cftv4phone Cftv
4phone Cftv
 
Le burnout moyens d'action pratiques pour soutenier les personnes en burn out...
Le burnout moyens d'action pratiques pour soutenier les personnes en burn out...Le burnout moyens d'action pratiques pour soutenier les personnes en burn out...
Le burnout moyens d'action pratiques pour soutenier les personnes en burn out...
 
Saint-Seb' Le Mag 135 juillet-août 2015
Saint-Seb' Le Mag 135 juillet-août 2015Saint-Seb' Le Mag 135 juillet-août 2015
Saint-Seb' Le Mag 135 juillet-août 2015
 
La Géopolitique du tourisme: Cas de la République centrafricaine.
La Géopolitique du tourisme: Cas de la République centrafricaine.La Géopolitique du tourisme: Cas de la République centrafricaine.
La Géopolitique du tourisme: Cas de la République centrafricaine.
 
Mounir ben chakroun
Mounir ben chakrounMounir ben chakroun
Mounir ben chakroun
 
Audika s'implante en belgique
Audika s'implante en belgiqueAudika s'implante en belgique
Audika s'implante en belgique
 
Renouvellement junior association
Renouvellement junior associationRenouvellement junior association
Renouvellement junior association
 
Guide de formations rija 2011
Guide de formations rija  2011Guide de formations rija  2011
Guide de formations rija 2011
 
El nanotransistor una aplicación descriptiva ing. ancizar paredes
El nanotransistor una aplicación descriptiva ing. ancizar paredesEl nanotransistor una aplicación descriptiva ing. ancizar paredes
El nanotransistor una aplicación descriptiva ing. ancizar paredes
 
1er Rendez-Vous E-tourisme à Obernai le 16-05-2013
1er Rendez-Vous E-tourisme à Obernai le 16-05-20131er Rendez-Vous E-tourisme à Obernai le 16-05-2013
1er Rendez-Vous E-tourisme à Obernai le 16-05-2013
 
Paques
PaquesPaques
Paques
 
Actions de service
Actions de serviceActions de service
Actions de service
 

Template metaprogramming 101: Desmystifying C++ metaprogramming

  • 1. Template metaprogramming 101 Desmitificando la metaprogramación en C++ Manu Sánchez @Manu343726, Oct 2014
  • 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.
  • 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. 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. 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. 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. 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()!
  • 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. 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. 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. 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.
  • 15. 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.
  • 16. 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?
  • 17. Metaprogramación en C++: Pitfalls ● typename ::type ● <><<<>>>><><<<>>>::<<<>>>::<><> ● template<template<typename> class > class ● En resumen: Una sintaxis horrible.
  • 18. 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.
  • 19. 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.
  • 20. 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.
  • 21. Metaprogramación en C++ ● Pero cuando funciona...
  • 23. 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.
  • 24. Cálculo en tiempo de compilación ● ¿Y qué pasa con constexpr? Una herramienta más. Mejor para unos casos y peor para otros.
  • 25. Generación y manipulación de tipos (y su código subyacente)
  • 26. 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.
  • 27. Typelists ● Como su nombre indica, son “listas” cuyos elementos son tipos. ● Muy fáciles de implementar gracias a las variadic templates.
  • 28. 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.
  • 29. 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.
  • 31. Metafunciones de alto nivel ● Haskell, otra vez ● foldl, foldr, filter, map, etc ● Variadic templates: O(1) map, wow!
  • 32. Evaluación uniforme de expresiones ● tyename ::type es totalmente ilegible y escala pobremente. ● Mi propuesta: tml::eval
  • 33. 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>
  • 34. 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>>>>;