我有一個整數N我知道在編譯時。我也有一個std :: array保存描述N維維數組的形狀的整數。我想在編譯時使用元編程技術來生成嵌套循環,如下所述。如何在編譯時生成嵌套循環
constexpr int N {4};
constexpr std::array<int, N> shape {{1,3,5,2}};
auto f = [/* accept object which uses coords */] (auto... coords) {
// do sth with coords
};
// This is what I want to generate.
for(int i = 0; i < shape[0]; i++) {
for(int j = 0; j < shape[1]; j++) {
for(int k = 0; k < shape[2]; k++) {
for(int l = 0; l < shape[3]; l++) {
f(i,j,k,l) // object is modified via the lambda function.
}
}
}
}
注參數Ñ在編譯時已知,但可能合輯之間不可預測的變化,因此我不能硬編碼的環如上。理想情況下,循環生成機制將提供一個接受lambda函數的接口,生成循環並調用產生如上所述等效代碼的函數。我知道可以在運行時用一個while循環和一系列索引編寫一個等價的循環,而且這個問題已經有了答案。然而,我對這個解決方案不感興趣。我也對涉及預處理器魔術的解決方案不感興趣。
是不是你的編譯器上展開循環時優化打開了? – Arunmu
他可能很好地展開一些循環,但這不是重點。我問的是循環生成不循環展開。無論如何,該數組可以保存比上面指定的整數大得多的值。一般來說,完全展開循環是不可能的。 –
使用單循環,並從單循環索引計算「i」,「j」,「k」和「l」等。 –