Шаблонный метод C ++ для выбора правильного способа печати данных

У меня есть программа, написанная на C ++, которая использует матрицы, и я хотел бы распечатать их. В программе матрицы имеют тип integer или unsigned 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 с правильными строками формата?

0

Решение

Если единственными типами, которые могут существовать в матрице, являются целочисленные типы, просто приведите его к 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.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]