等价参数的c++函数专门化



我和其他许多人一样,正在为我个人编写一个线性代数库。在这样做的过程中,我试图学习更多关于在c++中使用模板编程的知识。我有一个类,类似于

template<typename T, size_t N, size_t M = N>
class Matrix
{
    ...
}

现在,我想将某些运算限制在方阵中(例如行列式)。但是当我尝试添加:

T Determinant<T,N,N>();

编译失败,错误提示"<'前缺少';'"。我试过在行列式调用上方添加另一个模板,没有任何成功。如能提供任何建议,我将不胜感激。

不幸的是,您不能像这样为特定的模板参数专门化函数,您必须对整个类进行专门化。因为你不想重写整个代码,你可能想使用继承。

//shared code
template<typename T, size_t N, size_t M>
class BaseMatrix
{
    //existing code
};
// non-square general case
template<typename T, size_t N, size_t M=N>
class Matrix : public BaseMatrix<T,N,M>
{
    //forwarding headers
    Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {}
};
//square matrix specialization
template<typename T, size_t N>
class Matrix : public BaseMatrix<T,N,N>
{
    //forwarding headers
    Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {}
    T Determinant();
};

现在,我想将某些运算限制在方阵中(例如行列式)。

你是指这样的自由函数吗?

template< typename T, std::size_t N >
T determinant( Matrix< T, N, N > const& m ){ ... }

或者你指的是类成员吗?如果您需要一个类成员,那么您最好将所有通用功能移到基类中,并在Matrix上使用模板专门化来包含方阵的额外功能。

我支持基类的想法。有一个Matrix类和一个SquareMatrix子类。在SquareMatrix类中声明行列式方法,并安全地假设矩阵是方形的,而不必处理模板。行列式方法会更简单,调用它的代码也会更简单。

必须像这样声明一个变量:Matrix<float, 10, 10> myMatrix; .

最新更新