如何获得几个chrono :: time_points的平均值

时间:2018-01-11 17:42:59

标签: c++ c++14 chrono

获得几个数字的平均值的公式当然是众所周知的:

此公式可以很容易地用来获得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?

1 个答案:

答案 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是一种特殊情况,因为durationsum不能处理零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中编码,这种语法更详细,但完全可行。