我有一个矩阵类,其大小由模板参数决定。如何避免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