Я создаю шаблонный Matrix
класс, и я ограничил параметры шаблона целыми и плавающими точечными типами данных
template class Matrix<int>;
template class Matrix<float>; ..etc
Я реализовывал random()
статическую функцию-член, и чтобы сделать ее равномерным случайным распределением от 0.0
до 1.0
, я использовал std::is_floating_point<T>
, чтобы ограничить использование шаблонов плавающих типов точек.и я думал, что static_assert
сработает, если только T
не является типом с плавающей запятой, но утверждение не выполняется для каждого template class Matrix<T>;
, где T является целочисленным типом.
Когда я закомментирую все целочисленные типы, он работает нормально, но я не могу этого сделать, поскольку мне нужно иметь возможность создавать Matrix<T>
экземпляров с T
, это интегральный тип.Как бы это исправить?
Обратите внимание, что я предоставил template class Matrix<T>
для каждого целочисленного / плавающего -точечного типа, потому что я получаю ошибку undefined reference
.Поэтому я ограничиваю инициализацию целочисленными и плавающими точечными типами.
// Matrix.cpp
template<typename T>
Matrix<T> Matrix<T>::rand(const size_t& r, const size_t& c) {
Matrix<T> result{ r, c };
static_assert(std::is_floating_point<T>::value,
"result_type must be a floating point type");
const float range_from = 0.0;
const float range_to = 1.0;
std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_real_distribution<T> distr(range_from, range_to);
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
result[i][j] = distr(generator);
}
}
return result;
}
//...
template class Matrix<int>;
template class Matrix<long>;
template class Matrix<float>;
template class Matrix<double>;