2012-12-15 4 views
0

C++로 작성된 프로그램에서 행렬을 사용하고 있으며이를 인쇄하고 싶습니다. 프로그램에서 행렬은 정수 또는 부호없는 char 유형 중 하나입니다. 이것은 제가 지금 인쇄를하기 위해 사용하고있는 코드입니다.올바른 방법으로 데이터를 인쇄 할 수있는 C++ 템플릿 방법

template<class T> 
void print_matrix(const int& num_rows, const int& num_cols, T** M) 
{ 
     for (int row = 0; row < num_rows; row++) { 
       for (int col = 0; col < num_cols; col++) { 
         std::cout << std::setw(5) << M[row][col]; 
       } 
       std::cout << std::endl; 
     } 
} 

내 문제는 부호없는 문자 행렬의 경우 값이 숫자로 해석되지 않는다는 것입니다. 예를 들어 제로 매트릭스의 경우 출력이 콘솔에 표시되지 않습니다. 두 가지 유형의 행렬을 올바르게 인쇄하는 방법을 알아 내기 위해 템플릿 방식의 형식 정보를 사용할 수있는 방법이 있습니까? 올바른 형식의 문자열로 printf를 사용하는 두 가지 유형의 인쇄 방법을 만드는 데 의존해야합니까?

답변

2

매트릭스에 존재 할 수있는 유일한 유형의 경우 정수 유형은 단지 long에 캐스팅 :

template<class T> 
void print_matrix(const int& num_rows, const int& num_cols, T** M) 
{ 
     for (int row = 0; row < num_rows; row++) { 
       for (int col = 0; col < num_cols; col++) { 
         std::cout << std::setw(5) << static_cast<long>(M[row][col]); 
       } 
       std::cout << std::endl; 
     } 
} 

을이 당신이 다음 말해 원하는 내가 다른 솔루션을 제공 할 것입니다 무엇을하지 않은 경우.

template<typename T> 
struct matrix_print_type { 
    typedef T type; 
}; 
template<> 
struct matrix_print_type<char> { 
    typedef int type; // cast chars to ints 
}; 
template<class T> 
void print_matrix(const int& num_rows, const int& num_cols, T** M) 
{ 
     for (int row = 0; row < num_rows; row++) { 
       for (int col = 0; col < num_cols; col++) { 
         std::cout << std::setw(5) << static_cast<typename matrix_print_type<T>::type>(M[row][col]); 
       } 
       std::cout << std::endl; 
     } 
} 

또한 과부하 또는 enable_if을 사용할 수


또 다른 해결책은에 캐스팅을 결정하기 위해 metafunction를 만드는 것입니다.

+0

내가 지금하고있는 일에 효과가있을 것이지만 좀 더 일반적인 해결책이 있는지 궁금해하고 있습니다. 행렬 항목이 부동 소수점 유형 일 수 있다면 무엇을 할 것입니까? – martega

+0

@martega 업데이트되었습니다. – Pubby

+0

감사합니다. 그건 내가 생각하기에 쉽지 않거나 예쁜 것이 아니었다. – martega