首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为变量的C++表达式

作为变量的C++表达式
EN

Stack Overflow用户
提问于 2011-02-27 12:16:19
回答 4查看 311关注 0票数 1

我正在DSEL上工作,并希望有以下内容:

代码语言:javascript
复制
Bra ij;
Ket kl, cd;

(ij||kl); // initialize some array
(ij||cd); // ditto

....
T(i,j,k,l)*(ij||kl); // do some math without recomputing (ij||kl)

所以从本质上讲,我想让表达式充当变量。有可能吗?

到目前为止,我的想法是有一个“单例”工厂,它使用expression (ij|kl)生成/查找数组。还要别的吗?

EN

回答 4

Stack Overflow用户

发布于 2011-02-27 12:20:37

如果您不想重新计算ij||kl,那么只需将它们存储到该表达式返回的任何类型的变量中。这正是变量存在的原因之一。

好吧,这是我唯一能想到的方法,尽管听起来不是很好。您可以做的是,当操作符||函数被调用时,将操作数以及结果存储到实例变量中(如果操作符||是某个类的成员函数),或者存储到一个静态分配的变量中(如果操作符||在其上声明为lonesome)。

下次调用运算符||时,请检查操作数是否与上次调用时相同。如果是,只需返回您存储的最后一个结果。否则,计算新的结果。

这应该能起到作用。令人讨厌的是,它需要将操作数复制到其他变量中,根据环境的不同,这可能会耗费大量资源。然而,如果变量是不可变的,你可以只保留指向操作数的指针,这会更便宜一些。

如果您想更进一步,可以使用map或其他东西来存储多个先前调用的操作数和结果。这样,如果您需要对多个不同的计算执行此操作,则此方法将起作用。

票数 2
EN

Stack Overflow用户

发布于 2011-02-27 13:12:06

要做这类事情,很明显你需要一些全局的知识。换句话说,您必须构建某种全局或半全局结构,以保持操作/表达式的记录。

我建议您构建一个图(可能使用BGL),其中节点是表达式(变量是零度运算符的特例)。如果将每个操作数作为关联顶点连接到操作符的顶点,则可以构造一个图。稍后,当需要实际计算表达式时,您可以首先使用一些修剪规则遍历图,从而消除冗余操作。如果你确保图中没有任何顶点被复制,那么修剪是隐式的,我猜。

如果您希望避免使用全局数据,我建议您使用某种类型的表达式管理器类,并将所有操作注册到它。例如,如下所示:

代码语言:javascript
复制
int main() {
  expression_handler expression; //have some class to handle a sequence of operations.

  expression
  << (ij||kl)
  << (ij||cd)
  << ....
  << T(i,j,k,l)*(ij||kl); //register all the expressions, in order.

  expression.evaluate(); //evaluate the expression (possibly optimizing the graph before)

  return 0;
};
票数 2
EN

Stack Overflow用户

发布于 2011-02-27 13:48:45

我会把Ken和Mikael的建议结合起来做。这类事情在操作符重载时非常容易,特别是当你在每一端都有自定义类型的时候。

  1. Bra::ExpressionHandle ||方法返回临时对象运算符。
  2. 在创建ExpressionHandle时,它还在内部使用全局存储注册ExpressionBody (这使您不必使用实例变量,但这意味着您必须保留所有表达式,直到程序结束,或者显式all对象既是声明(表达式树)又是可选结果。您可以使用惰性技术来仅在它们最终被called.
  3. Invoking时进行求值,当使用下面的代码行创建ExpressionHandle时,就会发生ExpressionBody

上面的T(i,j,k,l)*(ij||kl);

  • The (ij||kl) )会创建一个表达式,并试图注册它,但找到一个已存在的全局表达式,所以只返回一个指向全局instance.

  • operator*(const表达式句柄的ExpressionBody &,诸如此类)会要求ExpressionHandle返回其结果,此时它要么返回缓存的结果,要么执行第一次计算并缓存它。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5131412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档