2012-12-02 2 views
0

두 개의 Matrice 클래스가 있다고 가정 해 보겠습니다. 한 행렬은 2 x 2이고, 다른 행렬은 3 x 3입니다. 물론 같은 차원이 아닌 두 행렬을 곱할 수는 없습니다.C++ 사용자 정의 컴파일시 검사

런타임 검사를 할 수 있다는 것을 알고 있지만 C++ 언어를 사용하여 컴파일 타임 검사를 작성하는 방법이 있습니까? 그래서 서로 다른 차원의 두 개의 정의 된 행렬이 곱 해지는 프로그램을 컴파일하려고하면 컴파일 타임 오류가 발생합니다.

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

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

또한이 항목을 읽는 동안이 기능이있는 프로그래밍 언어가 있습니까?

+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); 

, 결과 행렬의 크기는의 크기에 의해 추론된다 행렬은 컴파일 시간이 치수 그러나, 만약, 당신이 자연적으로 컴파일 시간 검사를 필요로 오게 생각할 것 두 개의 인수 행렬. 이들이 부적합한 차원을 가지면, 적절한 곱셈 연산자가 발견되지 않습니다.

0

템플릿 매개 변수로 차원을 사용하여 템플릿 행렬 클래스를 정의 할 수 있습니다. 이 유형에 대해서만 operator*()을 정의하면 컴파일러는이 유형을 다른 유형과 곱셈을 방지합니다.

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