c++ - 通用模板函数总是返回整数值
问题描述
我正在编写下面的线性插值函数,它是通用的,但当前结果不是。
该函数在两个给定边界点之间找到所需数量的等距点线性。所需数量和边界都作为参数给出。作为返回,返回一个线性插值向量。
我担心返回类型的问题,它总是看起来是整数,即使它应该有一些尾数,例如:
vec = interpolatePoints(5, 1, 4);
for (auto val : vec) std::cout << val << std::endl; // prints 4, 3, 2, 1
但它应该打印:4.2, 3.4, 2.6, 1.8
我应该怎么做才能使其通用并具有正确的返回值?
代码:
template <class T>
std::vector<T> interpolatePoints(T lower_limit, T high_limit, const unsigned int quantity) {
auto step = ((high_limit - lower_limit)/(double)(quantity+1));
std::vector<T> interpolated_points;
for(unsigned int i = 1; i <= quantity; i++) {
interpolated_points.push_back((std::min(lower_limit, high_limit) + (step*i)));
}
return interpolated_points;
}
解决方案
经过一些简化后,函数可能如下所示:
template<typename T, typename N, typename R = std::common_type_t<double, T>>
std::vector<R> interpolate(T lo_limit, T hi_limit, N n) {
const auto lo = static_cast<R>(lo_limit);
const auto hi = static_cast<R>(hi_limit);
const auto step = (hi - lo) / (n + 1);
std::vector<R> pts(n);
const auto gen = [=, i = N{0}]() mutable { return lo + step * ++i; };
std::generate(pts.begin(), pts.end(), gen);
return pts;
}
返回的元素类型std::vector
是std::common_type_t<double, T>
. 因为int
,它是double
,因为long double
,它是long double
。double
看起来像一个合理的默认类型。
推荐阅读
- php - PHP && 给出错误答案
- python - 将多个文本块组合并制成表格
- spring-boot - Spring Boot 安全性允许发布请求,但仅在获得许可的情况下
- filebeat - Filebeat 不记录到文件,总是只记录到 syslog
- android - 如何在运行时在 DropDownMenuItems 列表中添加新项目?
- wordpress - 我需要将微信公众号文章导入Wordpress帖子或博客
- r - 通过将数据帧与不同的 nrow 数据帧进行比较,有条件地对数据帧进行子集化
- reactjs - React.Children.count 还是 children.length?
- c# - 如果它有一个值,我应该如何使用可空类型
- ruby-on-rails - 作业完成后返回响应 - 延迟作业