C ++自定义编译时检查

时间:2012-12-02 23:07:16

标签: c++ compilation

假设我有两个Matrice课程。一个矩阵是2乘2,另一个是3乘3,然后我将它们相乘。当然,我不能将两个没有相同尺寸的矩阵相乘。

我知道我可以构建运行时检查,但有没有办法使用c ++语言构建编译时检查?因此,如果我尝试编译一个程序,其中两个不同维度的定义矩阵相乘,则会产生编译时错误。

Matrix *matrix1 = new Matrix(2,2);
Matrix *matrix2 = new Matrix(3,3);

Matrix_Multiply(matrix1,matrix2);  // compiler throws error on this line 

同样在我们讨论这个主题时,是否有任何具有此功能的编程语言?

2 个答案:

答案 0 :(得分:1)

答案取决于矩阵如何获得维度:如果在运行时确定维度,则不进行编译时检查。但是,如果矩阵是编译时标注的,我认为你自然会最终编译时间检查:

template <typename T, int Width, int Height>
class Matrix;

template <typename T, int M, int N, int O>
Matrix<T, M, O> operator* (Matrix<T, M, N> const& lhs, Matrix<T, N, O> const& rhs);

也就是说,结果矩阵的大小由两个参数矩阵的大小推导出来。如果它们具有不匹配的尺寸,则不会找到合适的乘法运算符。

答案 1 :(得分:0)

您可以定义模板矩阵类,其中维度为模板参数。当您仅为此类型定义operator*()时,编译器将阻止此类型与另一种类型的乘法。

template<int rows, int cols> class matrix {
public:
    friend matrix operator*(const matrix &m1, const matrix &m2);
};