我对模板的理解是当我写void foo<T>(T x) {...}
并调用foo<int>(x);
和 foo<float>(x)
会生成 foo(int x)
和 foo(float x)
.
我想要的是在一些比较之前进行类型检查,但是由于编译器生成了两个版本的函数,所以比较部分在编译时会失败。
我的代码是
template <typename T>
void print(const std::vector<std::vector<T>>& matrix) {
std::cout << std::setprecision(3) << std::fixed;
for (int j=0; j < matrix[0].size(); j++) {
for (int i=0; i < matrix.size(); i++) {
// Fail on this line ↓
if ((std::is_floating_point<T>::value) &&
(matrix[i][j] == std::numeric_limits<float>::lowest())) {
std::cout << "✗ ";
continue;
}
std::cout << matrix[i][j] << " ";
}
}
std::cout << "\n";
}
在我调用的其他文件上
util::print<float>(best_value);
util::print<Point>(best_policy);
声明
std::vector<std::vector<float>> best_value;
std::vector<std::vector<Point>> best_policy;
我应该如何在保持 print
的同时解决该问题?功能,不必添加 Point
之间的比较和 float
?
最佳答案
只需更改std::numeric_limits<float>::lowest()
至 std::numeric_limits<T>::lowest()
关于c++ - 类型检查的编译时间失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57019189/