por lo que este metaprograma es más rápido ... por el constante literal. PERO: ¿Dónde en el mundo real tenemos Literales constantes? La mayoría de los programas que uso reaccionan a la entrada del usuario.
Es por eso que casi nunca se usa para valores. Por lo general, se usa en tipos. usar tipos para calcular y generar nuevos tipos.
hay muchos en el mundo real utiliza, algunas de las cuales ya está familiarizado con, incluso si no se dan cuenta.
Uno de mis ejemplos favoritos es el de iteradores. En su mayoría están diseñados solo con programación genérica, sí, pero la metaprogramación de plantillas es útil en un lugar en particular:
Para arreglar punteros para que puedan usarse como iteradores. Un iterador debe exponer un puñado de typedef, como value_type
. Los punteros no hacen eso.
Así código como el siguiente (básicamente idéntica a lo que se encuentra en Boost.Iterator)
template <typename T>
struct value_type {
typedef typename T::value_type type;
};
template <typename T>
struct value_type<T*> {
typedef T type;
};
es una muy simple metaprograma plantilla, pero que es muy útil. Le permite obtener el tipo de valor de cualquier tipo de iterador T, ya sea un puntero o una clase, simplemente por value_type<T>::type
.
Y creo que lo anterior tiene algunas ventajas muy claras cuando se trata de mantenimiento. Su algoritmo que opera en iteradores solo tiene que implementarse una vez. Sin este truco, tendrías que hacer una implementación para punteros y otra para iteradores "propios" basados en clases.
Trucos como boost::enable_if
pueden ser muy valiosos también. Tiene una sobrecarga de una función que solo debería habilitarse para un conjunto específico de tipos. En lugar de definir una sobrecarga para cada tipo, puede usar la metaprogramación para especificar la condición y pasarla al enable_if
.
Earwicker ya se ha mencionado otro buen ejemplo, un marco para la expresión de unidades físicas y dimensiones. Le permite expresar cálculos como con unidades físicas adjuntas, y aplica el tipo de resultado. La multiplicación de metros por metros produce una cantidad de metros cuadrados. La metaprogramación de plantillas se puede usar para producir automáticamente el tipo correcto.
Pero la mayoría de las veces, la metaprogramación de plantillas se usa (y es útil) en casos pequeños y aislados, básicamente para suavizar protuberancias y casos excepcionales, para que un conjunto de tipos se vea y se comporte de manera uniforme, lo que le permite usar programación genérica de manera más eficiente
Nunca tuvo mucho sentido para mí ... – Kawa
No te sientas mal, casi nadie lo entiende. –