使用表达式模板的中间结果

时间:2009-11-03 09:19:51

标签: c++ tree c++11 expression-templates

in C ++ Template Metaprogramming:Boost and Beyond中的概念,工具和技术

  

...表达式模板的一个缺点是它们倾向于鼓励编写大型复杂表达式,因为只有在调用赋值运算符之前,才会延迟求值。如果程序员想要在不提前评估的情况下重用某些中间结果,她可能会被迫声明一个复杂的类型,如:

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

(或更糟)请注意这种类型不仅精确而冗余地反映了计算结构,因此需要在公式发生变化时进行维护,但也要压倒它?对于C ++ DSEL来说,这是一个长期存在的问题。通常的解决方法是使用类型擦除捕获表达式,但在这种情况下,需要支付动态调度。最近由Bjarne Stroustrup本人带头进行了大量讨论,重新使用残留auto关键字来获取变量声明中的类型推导,以便上述内容可以重写为:

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

此功能对于C ++ DSEL作者和用户来说都是一个巨大的优势......

是否可以使用当前的c ++ std解决此问题。 (非C ++ 0X)

例如,我想写一个像:

这样的表达式

Expr X,Y

矩阵A,B,C,D

X = A + B + C

Y = X + C

d:= X + Y

其中operator:=最近一次评估表达式。

2 个答案:

答案 0 :(得分:4)

目前,您始终可以使用BOOST_AUTO()代替C ++ 0x的auto关键字来更轻松地获得中间结果。

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

答案 1 :(得分:2)

我不明白你的问题。 autoC++0x重新使用{{1}}。

我个人认为这是表达模板的一个缺点,因为它们经常继续使用比它们构建的对象更短的寿命,如果在我解释{{3}时捕获了表达式模板,则可能会变成错误}。