2012-02-29 11 views
9

Según tengo entendido, constexpr no es completa a diferencia de la metaprogramación de plantillas, así que creo que no son lo mismo. Entonces, la pregunta es ¿hasta qué punto el constexpr hace que la metaprogramación de plantillas sea obsoleta?C++ 11 constexpr a la meta-programación obsoleta de la plantilla?

+1

'constexpr' es Turing completo (ignorando los requisitos de infinito, obviamente). –

+0

@ R.MartinhoFernandes: Si 'constexpr' está completo, solo use' constexpr' para modelar una lista de enteros que se puedan cultivar en ambos extremos. – kennytm

+0

@ R.MartinhoFernandes: Puede ser interesante publicar esa respuesta en http://stackoverflow.com/questions/9201506/is-constexpr-based-computation-turing-complete. – kennytm

Respuesta

21

constexpr es absolutamente Turing-completo. La recursividad está permitida. Es una forma conveniente de definir funciones que funcionan tanto en tiempo de compilación como en tiempo de ejecución. Sin embargo, las funciones constexpr, al ser simples funciones, no pueden realizar operaciones en tipos. (A menos que utilice la metaprogramación de plantillas para definir dicha función, por supuesto).

Las plantillas de clase y constexpr se pueden usar para contener expresiones constantes en tiempo de compilación, pero allí termina la similitud. No son redundantes y TMP no desaparecerá en el corto plazo.

Sin embargo, algunos cálculos de tiempo de compilación particularmente feos podrían reescribirse más elegantemente como funciones adecuadas.

+5

+1 para la observación de que 'constexpr' no puede operar en tipos. –

+0

Gracias por explicarlo tan bien ... – polapts

Cuestiones relacionadas