2012-06-27 32 views
9

Como la metaprogramación en C++ es funcional: ¿hay alguna manera de hacer algo comparable a cualquier lenguaje de programación funcional (por ejemplo, Haskell) let o where construct?C++/Boost MPL: también código de estructura Haskell's let, where,

Estoy usando Boost :: MPL pero me gustaría tener más estructura para metafunciones más largas. La división en varias funciones está bien, pero preferiría dejar/en algunos casos.

+0

Llega un punto en el que tratar de meter con calzador más magia plantilla en C++ deja de dar vueltas útiles, especialmente cuando se trata de la compatibilidad futura y el mantenimiento. ¿Ha considerado escribir más código en un lenguaje funcional rápido que pueda generar librerías accesibles desde C/C++? (OCaml me viene a la mente) – Rook

+1

No, no lo he considerado. Estoy usando programación meta porque necesito hacer algo en tiempo de compilación, no porque quiero escribir código funcional. Mis piezas de código no son tan complejas. Solo pensé que si usaba la misma aplicación de función tres veces en una metafunción de 30 líneas, sería bueno usar alguna estructura. – user1034081

+0

En C++ 11, puede hacer un montón de procesamiento en tiempo de compilación con 'constexpr' en lugar de plantillas. – leftaroundabout

Respuesta

2

MPL no admite las cláusulas let, pero sí algunas de las bibliotecas creadas encima. Un ejemplo es metamonad. Como su nombre indica, también admite algunos otros conceptos funcionales de nivel superior (mónadas). Un gran inconveniente es que metamonad no es una parte oficial de la distribución de Boost.

En lo que respecta a las soluciones alternativas para MPL, dividir las cosas en funciones y usar más espacios de nombres para agruparlas y luego importar el símbolo importante en su espacio de nombres de nivel superior es probablemente su mejor opción.

+0

Gracias por señalarme a esa biblioteca. Parece ser lo que he estado buscando aunque todavía no lo sé, si lo usaré. Biblioteca extra, parece magia, ... – user1034081

+1

@ user1034081 Un usuario de MPL que se queja de magia;) – pmr

1

Boost.Phoenix tiene una construcción llamada let que le permite declarar las variables locales en un contexto de función de orden superior. Sin embargo, creo que es de alto nivel. Todavía es tiempo de ejecución, no de tiempo de compilación.

Desde la página enlazada:

let(_x = 1, _y = ", World") 
[ 
    // _x here is an int: 1 

    let(_x = "Hello") // hides the outer _x 
    [ 
     cout << _x << _y // prints "Hello, World" 
    ] 
] 
+0

En mi opinión, si desea escribir código funcional, debe tener un lenguaje funcional. Solo busco una construcción let porque la metaprogramación de la plantilla es funcional. – user1034081

Cuestiones relacionadas