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:=最近一次评估表达式。
答案 0 :(得分:4)
目前,您始终可以使用BOOST_AUTO()代替C ++ 0x的auto关键字来更轻松地获得中间结果。
Matrix x, y;
BOOST_AUTO(result, (x + y) * (x + y)); // or whatever.
答案 1 :(得分:2)
我不明白你的问题。 auto
将C++0x
重新使用{{1}}。
我个人认为这是表达模板的一个缺点,因为它们经常继续使用比它们构建的对象更短的寿命,如果在我解释{{3}时捕获了表达式模板,则可能会变成错误}。