0

行列を使用する C++ で記述されたプログラムがあり、それらを印刷したいと考えています。プログラムでは、行列は整数型または符号なし char 型のいずれかです。これは、印刷を行うために現在使用しているコードです。

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 つの異なるタイプの印刷方法を作成する必要がありますか?

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;
        }
}

これがあなたが望むものでない場合は、私に教えてください。私は別の解決策を提供します。


もう1つの解決策は、メタ関数を作成して、キャスト先を決定することです。

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 に答える