c++ - 小型平均

标签 c++

我想写一个通用的平均算法。也就是说,对于任何具有 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/

相关文章:

c++ - 可变参数列表程序行为异常 - cstdarg

c++ - 重新定义错误

c++ - 在没有互斥锁的情况下重新计数时如何避免竞争条件?

c++ - 将函数地址转换为 64 位整数 : Undefined/Ill-behaved?

c++ - std::vector::begin() - 1 是否未定义?

c++ - 从 x?y :z expression 得到了意想不到的答案

c++ - 名称查找说明

c++ - 将球体移动到平面永远不会预测 future 的碰撞

c++ - 在 Windows 10/DirectX 上仅在全屏模式下使用 VSYNC 撕裂(窗口模式工作正常)

c++ - 使用 .size() 与 const 变量进行循环