我有一個矩陣類,其大小由模板參數決定。如何避免C++類模板中的無限遞歸
template <unsigned cRows, unsigned cCols>
class Matrix {
...
};
我的程序使用幾個大小的矩陣,通常是2x2,3x3和4x4。通過使用模板參數而不是運行時參數設置矩陣大小,編譯器可以進行大量內聯和優化。
但現在我需要一個成員函數,它返回一個新的矩陣,它有一個較少的行和一個較少的列。
Matrix<cRows - 1, cCols - 1> Reduced(unsigned row, unsigned col) const { ... }
這個想法是,它會返回一個矩陣,刪除指定的行和列。實際上,這隻會被稱爲矩陣,它至少有三行三列,最小返回2x2。
編譯器沒有看到下限,所以它陷入了無限遞歸中,試圖實例化具有不斷減小的大小的模板。我試圖把在函數本身兩條線索,這些更小的尺寸就不會發生:
Matrix<cRows - 1, cCols - 1> Reduced(unsigned row, unsigned col) const {
static_assert(cRows > 1 && cCols > 1);
if (cRows <= 1 || cCols <= 1) throw std::domain_error();
Matrix<cRows - 1, cCols - 1> r;
// ... initialize r ...
return r;
}
無論是static_assert
還是if
語句來似乎是一個足夠強大的線索,一個爲0x0矩陣將永遠不會被編譯器生成。 (具有諷刺意味的是,它確實抱怨if
-statement具有恆定的編譯時間條件。)
有沒有人有關於如何避免此編譯時無限遞歸的任何建議?
他說2x2是最小的,但我仍然認爲這是最好的。也許可以添加'const int MinimumRows','const int MinimumColumns',這樣它就可以調整。 – GManNickG 2009-08-09 20:09:26
謝謝,這個伎倆。我更進了一步,使'Reduced'成爲非成員函數,使得專業化更容易。 – 2009-08-09 21:00:05