使用模板计算向量的平均值

Rak*_*111 3 c++ templates variadic-templates c++11

我做了一个简单的函数,取2 std::arraystd::arraystd::arrayss中值的平均值返回另一个函数.

template<typename T, std::size_t N>
std::array<T, N> average(const std::array<T, N>& a1, const std::array<T, N>& a2)
{
    std::array<T, N> array;
    for (std::size_t i = 0; i < N; ++i)
        array[i] = (a1[i] + a2[i]) / 2;

    return array;
}
Run Code Online (Sandbox Code Playgroud)

完美的工作.现在我想计算N个向量的平均值.所以我做到了这一点

template<typename T, std::size_t N, typename... Ts>
std::array<T, N> average(const Ts&... args)
{
    std::array<T, N> result;
    for (std::size_t i = 0; i < N; ++i)
    {
        T addedValues = 0;
        for (const auto& array : { args... })
            addedValues += array[i];

        result[i] = addedValues / sizeof...(args);
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

哪个也有效,但我必须指定生成的模板参数

std::array<int, 3> a{ 1, 2, 3 };
std::array<int, 3> b{ 3, 4, 5 };

auto c = average<int, 3>(a, b); //'<int, 3>' not good, possible without?
Run Code Online (Sandbox Code Playgroud)

我想不出另一种方式,有人可以帮助我吗?

101*_*010 5

前提是您还在模板功能的主体中进行了必要的更改.您可以更改模板函数的签名,如下所示:

template<typename T, std::size_t N, typename... Ts>
std::array<T, N> average(std::array<T, N> const &arr, const Ts&... args)
Run Code Online (Sandbox Code Playgroud)

这样,您就不必明确指定模板参数和模板参数推导会推断TN,因此,你可以打电话给你的average模板函数为:

std::array<int, 3> a{ 1, 2, 3 };
std::array<int, 3> b{ 3, 4, 5 };

auto c = average(a, b);
Run Code Online (Sandbox Code Playgroud)