C++ 小字体的平均值

C++ 小字体的平均值,c++,C++,我想写一个通用的平均算法。也就是说,对于具有运算符+(T)和运算符/(float)的任何类型T,我希望找到容器中T的平均值: 类似于此的内容适用于浮动类型: template<typename T> typename T::value_type RunningAverage(const T& v) { typename T::value_type vectorRunningAverage = 0; for(unsigned int i = 0; i < v.s

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

类似于此的内容适用于浮动类型:

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;
}


然后它将处理一个类似unsigned char的类型(不能添加多个unsigned char并将结果存储在unsigned char中而不会溢出),因为它可以隐式转换为float。但是,如果我有一些更复杂的类型(假设我想对
std::vector
中的组件求平均值,这不起作用。我是否缺少什么?或者这样做没有意义?

因此,您需要为类型
t
定义包含
t
值平均值的类型

C++特性提供了干净且不具侵入性的解决方案

template <class T>
struct average
{
    typedef float type; // could be or could be not sane default, depends on the domain
};
模板
结构平均
{
typedef float type;//可能是或可能不是sane默认值,取决于域
};
然后,对于需要“调优”的类型,您只需为
average
模板提供专门化(部分或全部):

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

template <class T>
struct average<MyMegaType<T> >
{
    typedef MyMegaType<T>::value_type type;
};
模板
结构平均
{
typedef double-type;//需要更高的精度吗
};
模板
结构平均
{
typedef MyMegaType::value_type;
};
而不是你的功能的本质

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

我认为您应该让调用者明确提及所需的返回类型:

template<typename T, typename ResultT = typename T::value_type>
ResultT RunningAverage(const T& v);
模板
结果运行平均值(常数T&v);

我还认为您应该使用开始和结束迭代器,而不是整个容器,因为这将使您的函数更通用(例如,您可以获得向量前半部分的平均值)。

将返回类型作为模板参数是一个好主意。这样,我可以对不可变的类型执行类似的操作(例如,库中的类型或STL容器样式类型等)。另外,好的,我将使用迭代器。谢谢Alexander。这将适用于我定义的MyMegaType之类的类型,但适用于我无法更改的类型(例如,从库中的类型或从我的平均向量示例中,不可能向向量添加“typedef…type”。我想我将使用John Zwinck提供返回(和内部)的解决方案)通过另一个模板参数键入。我想你没有得到它。你不应该在
向量
中添加任何东西来为它创建
平均
特征。特征的美妙之处在于,你不需要更改现有的类型来添加这个类型定义——你只需要为那些类型定义专门化。我想你是对的,我确实错过了特征的概念。我ied this:但是我得到了这个错误:error:调用'(average)(std::vector&')不匹配。有什么建议吗?您对
无符号字符的专门化不包含
运算符()的定义
:您需要实现所使用的模板专门化的所有成员。在这种情况下,我不会将任何成员函数设置为
平均值
traits,而只设置typedefs。然后我将实现将使用traits的泛型functor。
template<typename T>
typename average<T::value_type>::type RunningAverage(const T& v);
template<typename T, typename ResultT = typename T::value_type>
ResultT RunningAverage(const T& v);