我想写一个通用的平均算法。也就是说,对于任何具有运算符+(T)和运算符/(浮点数)的类型T,我想在容器中找到T的平均值:
像这样的东西适用于float-ish类型:
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中),因为它可以隐式转换为float。但是,如果我有一些更复杂的类型(比方说我想平均std::vector<std::vector<unsigned char> >
中的组件,这不起作用。是否有一些我缺少的东西?或者这样做是否有意义?
答案 0 :(得分:2)
所以你需要的是以某种方式为你的类型T
定义包含T
的平均值的类型。
C ++特征提供干净且不引人注目的解决方案。
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;
};
比你的功能的sgnature可能
template<typename T>
typename average<T::value_type>::type RunningAverage(const T& v);
答案 1 :(得分:1)
我认为你应该让调用者明确提到所需的返回类型:
template<typename T, typename ResultT = typename T::value_type>
ResultT RunningAverage(const T& v);
我也认为你应该开始&amp;结束迭代器而不是整个容器,因为它会使你的函数更通用(例如,你可以获得向量的前半部分的平均值)。