4

在 C++ 模板元编程中:来自 Boost 和 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

where operator := 在最迟时间计算表达式。

4

2 回答 2

4

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

Matrix x, y;
BOOST_AUTO(result, (x + y) * (x + y)); // or whatever.
于 2009-11-04T09:17:26.270 回答
2

我不明白你的问题。auto将被重C++0x用于自动类型推断

我个人认为这是表达式模板的一个缺点,因为它们通常依赖于比构建它们的对象具有更短的生命周期,如果按照我在此处的解释捕获表达式模板,则结果可能是错误的。

于 2009-11-03T12:04:32.540 回答