获得几个数字的平均值的公式当然是众所周知的:
此公式可以很容易地用来获得chrono::duration
s的平均值:
template <class Rep0, class Period0>
auto
sum(const std::chrono::duration<Rep0, Period0>& d0)
{
return d0;
}
template <class Rep0, class Period0, class ...Rep, class ...Period>
auto
sum(const std::chrono::duration<Rep0, Period0>& d0,
const std::chrono::duration<Rep, Period>& ...d)
{
return d0 + sum(d...);
}
template <class ...Rep, class ...Period>
auto
avg(const std::chrono::duration<Rep, Period>& ...d)
{
return sum(d...) / sizeof...(d);
}
但chrono::time_point
无法互相添加。我如何平均time_point
s?
答案 0 :(得分:17)
首先假设你可以添加time_point
s,然后操纵公式来消除这些添加:
首先从总和中分离 t 1 :
接下来两个添加和减去 t 1 :
因素和重新排列:
然后,由于你总计减去 t 1 的次数,你可以将它包括在总和中:
现在你要总结duration
s 而不是 time_point
!由于我们已经有了对duration
求和的函数,因此平均time_point
可以很容易地建立起来:
template <class Clock, class Duration0, class ...Duration>
auto
avg(const std::chrono::time_point<Clock, Duration0>& t0,
const std::chrono::time_point<Clock, Duration>& ...t)
{
return t0 + sum((t - t0)...) / (1 + sizeof...(t));
}
平均单个time_point
是一种特殊情况,因为duration
的sum
不能处理零duration
的求和(单位是什么?)。因此,很容易添加该案例的重载:
template <class Clock, class Duration0>
auto
avg(const std::chrono::time_point<Clock, Duration0>& t0)
{
return t0;
}
这是用C ++ 14编写的。它可以使用trailing return type declaration语法在C ++ 11中编码,这种语法更详细,但完全可行。