2010-03-26 11 views
10

¿Cuáles son las buenas introducciones a la creación de sistemas de plantillas de expresión C++? Me gustaría expresar la aritmética en los tipos definidos por el usuario al tiempo que evito los valores temporales (que pueden ser grandes) y aprender a hacerlo directamente en lugar de aplicar una biblioteca existente.Tutoriales y presentaciones a plantillas de expresión C++

He encontrado Todd Veldhuizen's original paper y un ejemplo del Josuttis C++ Templates book, y un artículo por Kreft & Langer. Se menciona en la clase 6 de un curso en Modern C++, que hace referencia a Josuttis. La biblioteca POOMA background presenta las plantillas de expresiones muy bien.

Estoy buscando simple, claras exposiciones.

+2

Boost parece utilizar esta técnica. Desde mi experiencia, es muy engorroso de usar y aún tiene muchas limitaciones; No me sorprendería que no hubiera explicaciones simples de cómo funciona esto también. – liori

+0

boost :: lambda tiene un propósito diferente que las plantillas de expresión. –

Respuesta

5

Debe obtener una copia de C++ Templates: The Complete Guide.

El ejemplo de código al que se vincula no tiene el texto adjunto, que es bastante útil (el capítulo sobre plantillas de expresión tiene 22 páginas). Sin el texto, todo lo que tienes es código sin ningún comentario o explicación sobre lo que hace y cómo y por qué lo hace.

+1

Vandevoorde y Josuttis tienen la única descripción realmente completa. El tema nunca va a ser * simple *, porque es un tema complicado y difícil, pero hacen el mejor trabajo. – jwismar

0

Tiene todas las fuentes a excepción del libro C++ científico, que en realidad es solo el documento original (de todos modos, de este tema) y está bastante anticuado. Puede ver la metaprogramación de plantillas de C++ para obtener técnicas más modernas creadas a partir de las ideas de plantillas de expresiones, pero algo "simple" no estará disponible hasta que sea simple.

0

Sugiero revisar los operadores de Boost en Boost Operators - Arithmetic. Estos son métodos con plantillas que extienden las operaciones aritméticas y de comparación fundamentales.

6

encontré Expression Templates Demystified a ser bastante bien explicado. Comienza mostrando cómo implementar expresiones matemáticas sin plantillas y muestra los conceptos y bloques de construcción básicos.

La segunda parte del artículo muestra cómo refactorizar la implementación inicial para usar plantillas en su lugar para un mejor rendimiento y un código reducido.

IMO, el artículo es una buena alternativa al capítulo de plantillas de expresiones en 'Plantillas de C++: la guía completa'.

0

para lo que quiere hacer, debe mirar el código de Boost.ublas, ya que hace exactamente eso.

Comience con el archivo vector.hpp y luego regrese a la jerarquía (padres de vector<>). Las matrices son un poco más complejas, pero el mecanismo es el mismo.

Ahora puedo aconsejar no tratar de reproducir la complejidad de la biblioteca como primer intento, como ublas_expression y cosas por el estilo. Puedes simplificarlo haciendo que tu tipo sea el objeto base y luego implemente un operador binario.

Mire aquí también: biblioteca lambda http://www.bnikolic.co.uk/blog/cpp-expression-minimal.html