【发布时间】:2009-08-09 20:00:49
【问题描述】:
我有一个矩阵类,其大小由模板参数决定。
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-statement 似乎都不是一个足够强的线索,可以让编译器永远不会生成 0x0 矩阵。 (具有讽刺意味的是,它确实抱怨 if-statement 具有恒定的编译时条件。)
有人对如何避免这种编译时无限递归有任何建议吗?
【问题讨论】:
标签: c++ templates recursion matrix