2011-01-09 11 views
23

¿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

11

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.

4

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.

+2

Creo que la pregunta es sobre Boost.MPL y no metaprogramación en general. – jalf

+0

No se puede hablar de MPL sin todas las cosas que lo conducen. –

+2

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

13

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 :)

3

Para añadir a la respuesta de Matthieu, que también se usa extensamente en ambos Boost.Python y Luabind.

+1

boost.proto, boost.spirit (qi, karma, lex) ... en realidad en la mayoría de otras bibliotecas de impulso ... –

3

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 
     >; 
    }; 
}; 
+0

Enlaces rotos y engaño :( – Quentin

+0

Tuve que sacar la biblioteca de github ... – rmccabe3701

Cuestiones relacionadas