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