簡體   English   中英

如何獲得幾個chrono :: time_points的平均值

[英]How to get the average of several chrono::time_points

獲得幾個數字的平均值的公式當然是眾所周知的:

這個公式可以很容易地用來獲得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 s不能互相添加。 我怎樣才能平均time_point

它有助於開始假設您可以添加time_point ,然后操縱公式以消除這些添加:

首先從總和中分出t 1

接下來加上減去t 1

因素和重新排列:

然后,由於你在求和時減去t 1的次數相同,你可以將它包含在總和中:

現在你總結duration s 而不是 time_point s! 由於我們已經有一個總和duration s的函數,平均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 s的sum不處理零duration s的總和(單位是什么?)。 因此,很容易添加該案例的重載:

template <class Clock, class Duration0>
auto
avg(const std::chrono::time_point<Clock, Duration0>& t0)
{
    return t0;
}

這是用C ++ 14編寫的。 它可以使用尾隨返回類型聲明語法在C ++ 11中編碼,該語法更詳細,但完全可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM