Pregunta

en C ++ plantilla Metaprogramación: conceptos, herramientas y técnicas de Boost y más allá

  

... Una desventaja de las plantillas de expresión es que tienden a fomentar la creación de expresiones grandes y complicados, porque la evaluación solamente se retrasa hasta que se invoca el operador de asignación. Si un programador quiere volver a utilizar algún resultado intermedio sin evaluar de manera temprana, ella puede ser obligado a declarar un tipo complicado como:

Expression<
           Expression<Array,plus,Array>,
           plus,
           Expression<Array,minus,Array>
          > intermediate = a + b + (c - d);
  

(o peor). Observe cómo este tipo no sólo con exactitud y de forma redundante refleja la estructura de la computationand así tendría que ser mantenido como los cambios de fórmula, sino también abruma? Este es un problema desde hace mucho tiempo para DSELs C ++. La solución habitual es capturar la expresión utilizando el tipo de borrado, pero en ese caso uno paga por reenvío dinámico. Ha habido mucha discusión recientemente, encabezada por el propio Bjarne Stroustrup, sobre reutilización de la palabra clave auto vestigial a obtener el tipo de deducción en la declaración de variables, por lo que lo anterior podría reescribirse como:

auto intermediate = a + b + (c - d);
  

Esta característica sería una gran ventaja para los autores C ++ DSEL y usuarios por igual ...

¿Es posible resolver este problema con la corriente std C ++. (No C ++ 0x)

Por ejemplo, yo quiero escribir una expresión como:

Expr X, Y

Matrix A, B, C, D

X = A + B + C

Y = X + C

D: = X + Y

Donde: operador. = Evalúan la expresión en el último momento

¿Fue útil?

Solución

Por ahora, siempre se puede utilizar BOOST_AUTO () en el lugar de la palabra clave auto de C ++ 0x para obtener resultados intermedios con mayor facilidad.

Matrix x, y;
BOOST_AUTO(result, (x + y) * (x + y)); // or whatever.

Otros consejos

No entiendo su pregunta. auto va a ser reutilizada en C++0x para href="http://en.wikipedia.org/wiki/C%2B%2B0x#Type_inference" automática inferencia de tipos .

Yo personalmente veo esto como un inconveniente para las plantillas de expresión ya que a menudo transmiten en tener una esperanza de vida menor que los objetos que se construyen sobre la cual puede llegar a ser falsa si la plantilla de expresión es capturado como explico here .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top