我正在为量子力学编写一个小型库,我想使用表达式模板来形成运算符表达式。特别是用表达模板形成哈密顿量。
我基本上遵循这个源来构造代码并重载相应的运算符+ * - :https://en.wikipedia.org/wiki/Expression_templates
形成哈密顿量的表达式需要求和
Vec x = u_1 + u_2 + ... + u_N
其中N是(const)整数,u_i也是Vec类型。在代码中编写此表达式有效,但我希望能够编写
Vec x = Sum_{i=0}^{N} u_i
如何做到这一点?
------------编辑------------
经过一些研究并在评论的帮助下,我想出了静态循环的想法......在谷歌上搜索后,我在http://www.drdobbs.com/loops-metaloops-c/184401835?pgno=8找到了一篇文章,这正是我所需要的。
答案 0 :(得分: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/