在 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.

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top