0

我有一个用 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;
        }
}

我的问题是,对于 unsigned char 矩阵,这些值不会被解释为数字。例如,对于零矩阵,输出不会显示在控制台上。有什么方法可以使用模板化方法中的类型信息来确定如何正确打印这两种类型的矩阵?我是否必须求助于使用具有正确格式字符串的 printf 的两种不同类型的打印方法?

4

1 回答 1

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。

于 2012-12-15T05:26:48.443 回答