2015-10-17 23 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