gpt4 book ai didi

c++ - 小型平均

转载 作者:行者123 更新时间:2023-11-30 03:03:25 25 4
gpt4 key购买 nike

我想写一个通用的平均算法。也就是说,对于任何具有 operator+ (T) 和 operator/(float) 的类型 T,我想找到容器中 T 的平均值:

像这样的东西适用于 float 类型:

template<typename T>
typename T::value_type RunningAverage(const T& v)
{
typename T::value_type vectorRunningAverage = 0;

for(unsigned int i = 0; i < v.size(); ++i)
{
vectorRunningAverage = (v[i] + i*vectorRunningAverage)/(i+1);
}

return vectorRunningAverage;
}

我可以改变

  typename T::value_type vectorRunningAverage = 0;

float vectorRunningAverage = 0;

然后它可以使用像 unsigned char 这样的类型(不能添加超过几个 unsigned char 并将结果存储在 unsigned char 中而不会溢出),因为它可以隐式转换为 float。但是,如果我有一些更复杂的类型(比如我想对 std::vector<std::vector<unsigned char> > 中的组件进行平均,这不起作用。我是否遗漏了什么?或者这样做没有意义吗?

最佳答案

所以您需要以某种方式为您的类型定义 T包含 T 的平均值的类型是什么? .

C++ traits 提供干净且非侵入式的解决方案。

template <class T>
struct average
{
typedef float type; // could be or could be not sane default, depends on the domain
};

然后,对于需要“调整”的类型,您只需为 average<> 提供专门化(部分或全部)模板:

template <>
struct average<double>
{
typedef double type; // want more precision
};

template <class T>
struct average<MyMegaType<T> >
{
typedef MyMegaType<T>::value_type type;
};

你的函数的签名可能是

template<typename T>
typename average<T::value_type>::type RunningAverage(const T& v);

关于c++ - 小型平均,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9371130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com