使用表达式模板的中间结果
-
13-09-2019 - |
题
在 C++ 模板元编程中:Boost 及其他概念、工具和技术
...表达式模板的一个缺点是它们往往鼓励编写大型、复杂的表达式,因为计算只会延迟到调用赋值运算符为止。如果程序员想要重用某些中间结果而不提前评估它,她可能会被迫声明一个复杂的类型,例如:
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)
例如我想写一个表达式,如:
表达式 X,Y
矩阵A、B、C、D
X=A+B+C
Y=X+C
D:=X+Y
其中运算符 := 在最晚的时间计算表达式。
解决方案
目前,您可以随时使用 BOOST_AUTO() 代替 C++0x 的 auto 关键字,以更轻松地获得中间结果。
Matrix x, y;
BOOST_AUTO(result, (x + y) * (x + y)); // or whatever.
不隶属于 StackOverflow