我正在编写矩阵类。看看这个定义:
template <typename T, unsigned int dimension_x, unsigned int dimension_y>
class generic_matrix
{
...
generic_matrix<T, dimension_x - 1, dimension_y - 1>
minor(unsigned int x, unsigned int y) const
{ ... }
...
}
template <typename T, unsigned int dimension>
class generic_square_matrix : public generic_matrix<T, dimension, dimension>
{
...
generic_square_matrix(const generic_matrix<T, dimension, dimension>& other)
{ ... }
...
void foo();
}
generic_square_matrix 类提供矩阵乘法等附加功能。这样做没有问题:
generic_square_matrix<T, 4> m = generic_matrix<T, 4, 4>();
由于构造函数的原因,即使类型不是 generic_square_matrix,也可以将任何方阵分配给 M。这是可能的,因为数据不会跨子级更改,只会更改受支持的函数。这也是可能的:
generic_square_matrix<T, 4> m = generic_square_matrix<T, 5>().minor(1,1);
相同的转换适用于此。但是现在问题来了:
generic_square_matrix<T, 4>().minor(1,1).foo(); //problem, foo is not in generic_matrix<T, 3, 3>
为了解决这个问题,我希望 generic_square_matrix::minor 返回 generic_square_matrix 而不是 generic_matrix。我认为唯一可能的方法是使用模板专业化。但是由于专业化基本上被视为一个单独的类,所以我必须重新定义所有功能。我不能像调用派生类那样调用非专业类的函数,所以我必须复制整个函数。这不是一个很好的通用编程解决方案,而且需要大量工作。
C++ 几乎可以解决我的问题:派生类的虚函数可以返回与基类返回的不同类的指针或引用,如果这个类是从基类返回的类派生的。generic_square_matrix派生自 generic_matrix,但该函数不返回指针也不返回引用,因此此处不适用。
是否有解决此问题的方法(可能涉及完全不同的结构;我唯一的要求是尺寸是模板参数并且方阵可以具有附加功能)。
提前致谢,
路德