【发布时间】:2019-10-29 13:31:30
【问题描述】:
我正在制作一个模板化的Matrix 类,并且我将模板参数限制为 integral 和 floating 点数据类型
template class Matrix<int>;
template class Matrix<float>; ..etc
我正在实现一个random() 静态成员函数,为了使其从0.0 到1.0 均匀随机分布,我使用std::is_floating_point<T> 来限制浮动 模板的使用> 点类型。我认为如果只有T 不是浮点类型,static_assert 就会触发,但是对于每个template class Matrix<T>;,其中 T 是 integral 类型的断言都会失败。
当我注释掉所有 integral 类型时,它工作正常,但我不能这样做,因为我需要能够使 Matrix<T> 实例与 T 是一个 整型。我该如何解决?
请注意,我为每个 integral/floating 点类型提供了 template class Matrix<T>,因为我收到了 undefined reference 错误。所以我将初始化限制为 integral 和 floating 点类型。
// 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>;
【问题讨论】:
-
如果显式实例化类(以及它的所有(非模板)方法),则需要 SFINAE(或 C++20 的
requires)或专业化
标签: c++ class c++11 templates typetraits