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

3
我写了一个简单的函数,它接受两个 std::array,并返回另一个 std::array,其中包含这些 std::array 中值的平均值。
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;
}

功能完美。现在我想要计算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;
}

这也可以实现,但是我需要指定生成的模板参数。

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?

我想不出别的方法了,有人能帮帮我吗?


1
我建议您使用迭代器(begin和end)或范围/span,这样您不仅限于std::array<>,而且可以使用所有容器类型。 - lorro
@lorro 好的,会做到的 :) - Rakete1111
1个回答

5
只要您在模板函数的主体中也进行了必要的更改。您可以按照以下方式更改模板函数的签名:
template<typename T, std::size_t N, typename... Ts>
std::array<T, N> average(std::array<T, N> const &arr, const Ts&... args)

这样,您就不必显式指定模板参数,模板参数推导会推断出 TN,因此您可以像这样调用您的 average 模板函数:
std::array<int, 3> a{ 1, 2, 3 };
std::array<int, 3> b{ 3, 4, 5 };

auto c = average(a, b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接