2015-10-17 56 views
1

我写了量子力学的一个小型图书馆,我想用表达式模板,形成运营商的表达式。特别是用表达模板形成哈密顿量。表达模板和求和符号

我基本上遵循此源来构造代码和重载相应运营商+ * - :https://en.wikipedia.org/wiki/Expression_templates

形成用于哈密顿表达需要总和

Vec x = u_1 + u_2 + ... + u_N 

其中,N是(常数)整数和u_i也是Vec类型的。在代码中编写这个表达式,但我希望能够写

Vec x = Sum_{i=0}^{N} u_i 

如何做到这一点?

------------ ------------编辑

经过一番研究,并与评论的帮助下,我想出了一个主意静态for循环...谷歌上搜索后,我发现在一篇文章中http://www.drdobbs.com/loops-metaloops-c/184401835?pgno=8这正是我需要的。

+0

你问如何编写执行使用表达式和函数的数组大小扣除? –

+0

是的,这正是我的问题。 – user2460530

+0

所以,问问题。这是一个问答网站。 – juanchopanza

回答

0

没有办法写一个模板或功能神奇的图案从周围的范围相匹配的变量,所以你u_i语法不能工作。你可以做一个宏类似的东西,例如:

#define SUM_4(x) x ## 1 + x ## 2 + x ## 3 + x ## 4 

用法:

Vec u_1, u_2, u_3, u_4; 
... 
Vec x = SUM_4(u_); 

你需要定义额外的宏源向量的其他号码。

在C++中的下标操作者被数组访问,例如模拟u[1], u[2], ...。如果你愿意保持Vec数组,你可以写,遍历该阵列上的通用功能。在这种情况下,参数将是数组。喜欢的东西:

template<typename T, int N> 
T sum(T (&u)[N]) 
{ 
    // (or your preferred summation procedure) 
    T x = u[0]; 
    for (int i=1; i < N; ++i) 
     x += u[i]; 
    return x; 
} 

用法:

Vec u[4]; 
... 
Vec x = sum(u); 

更好的使用std::vector或固定大小的数组模板。

P.S.考虑使用Eigen

编辑:更新sum()模板与http://www.cplusplus.com/articles/D4SGz8AR/

+0

为什么不让编译器推导出N? –

+0

@MarkGlisse,因为我不知道该怎么做。但现在我知道了。固定。 –

+0

非常感谢您的回答。虽然我不完全确定要理解。在你提出的总结方式中,因为T型是Vec,那么operator + =应该返回类似VecAdd 的东西,不是吗? (请参阅https://en.wikipedia.org/wiki/Expression_templates)。因此,我的理解是,诸如x + = u [i];不可能? – user2460530