首页 > 解决方案 > 通用模板函数总是返回整数值

问题描述

我正在编写下面的线性插值函数,它是通用的,但当前结果不是。

该函数在两个给定边界点之间找到所需数量的等距点线性。所需数量和边界都作为参数给出。作为返回,返回一个线性插值向量。

我担心返回类型的问题,它总是看起来是整数,即使它应该有一些尾数,例如:

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;
}

标签: c++c++11c++17

解决方案


经过一些简化后,函数可能如下所示:

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::vectorstd::common_type_t<double, T>. 因为int,它是double,因为long double,它是long doubledouble看起来像一个合理的默认类型。


推荐阅读