¿Puede compartir algún ejemplo del uso de Boost::MPL en el mundo real (excepto lambdas), solo para permitirme comprender mejor sus propósitos y su campo de uso práctico? El tutorial de documentación MPL tiene un ejemplo de dimensional analysis, pero tal vez porque es un ejemplo académico, no me ha dado la sensación de Boost :: MPL y cuándo se puede utilizar de manera efectiva.Ejemplos de uso práctico de Boost :: MPL?
Respuesta
He utilizado Boost.Mpl para generar clases similares a variantes.
Por ejemplo, dada una lista tipo MPL como este:
typedef boost::mpl::set<Foo, Bar, Baz> type_set;
luego Yo uso boost::mpl::fold
para construir una cadena de clases derivadas de cada uno de otros que añade cada una std::unordered_set
de uno de los tipos en el tipo conjunto. El resultado final es una clase que contiene un unordered_set<Foo>
, un unordered_set<Bar>
y un unordered_set<Baz>
.
Y porque la clase se especifica en términos de una boost::mpl::set
, puedo iterar sobre este tipo para generar automáticamente otras funciones, así, como un operator==
que compara todos los unordered_set
s.
Utilizo una biblioteca de análisis dimensional mejorada llamada Boost.Units.
Desarrollé una biblioteca de reflexión en tiempo de compilación y luego utilicé esa biblioteca para crear una clase genérica que proporcione runtime-reflection a cualquier tipo reflejado en tiempo de compilación transferido. He utilizado esa compatibilidad para generar automáticamente componentes UI para editar las propiedades de dichos tipos reflejados.
También es primordial para la distribución de eventos dentro de nuestra aplicación. Por ejemplo, cuando alguien cambia las unidades en las que desea que esté el sistema, no es necesario que le enseñe a ese sistema que se han agregado elementos nuevos a dispositivos determinados porque el código usa MPL para analizar esos tipos y simplemente sabe que se ha agregado algo y lo cambia
Acabo de utilizar técnicas de metaprogramación para envolver las señales de Qt en algo que recupera el tipo de seguridad eliminado por su sistema y es capaz de conectarse con cualquier entidad funcional.
Pero para decir la verdad, casi con certeza ya usó técnicas de metaprogramación prácticamente aplicadas cuando utilizó algoritmos estándar como el género. Una implementación decente del algoritmo de ordenamiento utiliza una forma menos desarrollada de metaprogramación para analizar los iteradores pasados y luego utiliza el despacho de etiquetas para iniciar un algoritmo de ordenamiento capaz de utilizar completamente las características de esos iteradores.
Francamente, si no está haciendo la metaprogramación, entonces no está utilizando la potencia de C++ y puede que esté utilizando otra cosa.
El hecho es que Boost.MPL, como Boost.Preprocessor, son realmente componentes básicos.
La mayoría de las veces, probablemente lo use a través de otras bibliotecas, ya que una cantidad de bibliotecas Boost se basan en esas dos.
Por ejemplo:
- Boost.Fusion (que atraviesa los huecos entre tiempo de compilación y en tiempo de ejecución reinos)
- Boost.MultiIndex (para una interfaz más fácil)
- Boost.Unidad (por análisis dimensional)
- Boost.Variant puede, creo, también depende de que
es posible que uso unknowningly ya :)
Para añadir a la respuesta de Matthieu, que también se usa extensamente en ambos Boost.Python y Luabind.
boost.proto, boost.spirit (qi, karma, lex) ... en realidad en la mayoría de otras bibliotecas de impulso ... –
algo gracioso lo hice: https://github.com/edubois/static-factorial/blob/master/main.cpp
Se utiliza una pequeña parte de impulso :: MPL para calcular estáticamente el valor del factorial < 8>() ...
Esto puede ayudar a comprender la idea principal.
Uso boost :: mpl (y boost :: fusion) extensivamente en mi biblioteca stat_log. Esta biblioteca permite al usuario especificar una jerarquía de etiquetas estadísticas y de registro y sus comportamientos asociados, es decir, tipos de estadísticas por etiqueta (histograma, contador, etc.).
que dependen en gran medida metaprogramming a hacer lo correcto con el usuario hace:
stat_log::writeStat<IP_PKTS_RCVD>(450);
Por ejemplo, si el usuario define el rasgo Tipo:
template <>
struct stat_tag_to_type<IP_PKTS_RCVD>
{
using type = Accumulator<
stat_log::HistogramCount<
int,
1, //start bin
1500, //stop bin
10 //num_bits
>
>;
};
la "writeStat" llamada anterior se proxy (en tiempo de compilación) a una estadística de histograma. El poderoso aspecto de esta técnica de diseño es que el sitio de llamada "writeStat" no está en absoluto acoplado con la estadística particular elegida.
También uso una gran cantidad de MPL y boost :: fusion para ver realmente las estadísticas. Por su pregunta, consulte los siguientes archivos de la mayor concentración de impulso :: MPL:
https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/util/stat_log_impl.h https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/util/tag_commander.h https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/stat_log.h
especialmente la plantilla meta ingenioso "función" en stat_log_impl.h:
//This template is used in conjunction with an MPL algorithm
// with the same semantics as mpl::find_if.
//BoolFunc is the "condition" metafunction.
//StatTagFunc is a metafunction that transforms the given
// stat_tag into something the algorithm requires.
// For example the "Identity" metafunction would work here.
//StatTagArgs is extra arguments to the BoolFunc
template <template<typename...> class BoolFunc,
template<typename...> class StatTagFunc,
class... StatTagArgs>
struct tag_node_query
{
template<typename TheTagNode>
struct apply
{
using stat_tag = typename TheTagNode::tag;
using type = std::integral_constant
<
bool,
BoolFunc<
typename StatTagFunc<stat_tag>::type,
StatTagArgs...
>::value
>;
};
};
Enlaces rotos y engaño :( – Quentin
Tuve que sacar la biblioteca de github ... – rmccabe3701
- 1. Boost marcadores de posición MPL y Lambda
- 2. ¿Cómo usar boost :: mpl para redactar políticas?
- 3. Boost opciones de programa Ejemplos
- 4. Permutaciones de una lista de tipos usando boost :: mpl
- 5. ¿Hay alguna manera de salir de boost :: mpl for_each?
- 6. Uso eficiente práctico de IBOutletColletion
- 7. Artículos de Boost Fusion, ejemplos, tutoriales?
- 8. Matrices tridimensionales: uso práctico
- 9. Uso práctico para Dispatcher.DisableProcessing?
- 10. WPF Tunneling, uso práctico?
- 11. C++/Boost MPL: también código de estructura Haskell's let, where,
- 12. Boost MPL: Llame a una función (miembro) solo si existe
- 13. ¿Uso práctico de funciones al curry?
- 14. Uso práctico de eventos de interfaz
- 15. Uso práctico de árboles de expresión
- 16. por qué el conjunto boost mpl permite tipos no exclusivos
- 17. uso práctico de IdentityHashMap en Java 6
- 18. Uso práctico de la palabra clave `stackalloc`
- 19. uso práctico de la memoria virtual
- 20. Uso "cstdint" de Boost
- 21. Ejemplos MVC uso de var
- 22. ejemplos de uso iTextSharp PdfCopy
- 23. Uso práctico de campos de bits de longitud cero
- 24. Uso de boost :: iostreams :: tee_device?
- 25. Ventajas del uso de MPL impulso :: :: bool_ en lugar de un int const
- 26. Ejemplos de uso de RedisStore en socket.io
- 27. Ejemplos prácticos de uso de NLTK
- 28. ¿Algún ejemplo práctico de uso de LockSupport y AbstractQueuedSynchronizer?
- 29. Dame un caso de uso práctico de Multi-set
- 30. building boost Ejemplos de python usando Visual Studio 2008
Creo que la pregunta es sobre Boost.MPL y no metaprogramación en general. – jalf
No se puede hablar de MPL sin todas las cosas que lo conducen. –
pero puede preguntar "¿usa Boost.MPL?" Sin preguntar "¿usa algún otro ejemplo de metaprogramación de plantillas?", De la misma manera que puede preguntar "¿maneja un Volvo?" Sin preguntar "¿Maneja un automóvil? " – jalf