使用模板计算向量的平均值
Calculating average of vectors using templates
我做了一个简单的函数,它需要 2 std::array
和 returns 另一个 std::array
以及 std::arrays
中值的平均值。
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?
我想不出其他方法,有人可以帮我吗?
前提是您还对模板函数的主体进行了必要的更改。您可以按如下方式更改模板函数的签名:
template<typename T, std::size_t N, typename... Ts>
std::array<T, N> average(std::array<T, N> const &arr, const Ts&... args)
这样您就不必显式指定模板参数,模板参数推导将推导出 T
和 N
,因此您可以调用 average
模板函数:
std::array<int, 3> a{ 1, 2, 3 };
std::array<int, 3> b{ 3, 4, 5 };
auto c = average(a, b);
我做了一个简单的函数,它需要 2 std::array
和 returns 另一个 std::array
以及 std::arrays
中值的平均值。
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?
我想不出其他方法,有人可以帮我吗?
前提是您还对模板函数的主体进行了必要的更改。您可以按如下方式更改模板函数的签名:
template<typename T, std::size_t N, typename... Ts>
std::array<T, N> average(std::array<T, N> const &arr, const Ts&... args)
这样您就不必显式指定模板参数,模板参数推导将推导出 T
和 N
,因此您可以调用 average
模板函数:
std::array<int, 3> a{ 1, 2, 3 };
std::array<int, 3> b{ 3, 4, 5 };
auto c = average(a, b);