私があなたの質問を理解している場合、およびコンパイル時のさまざまな時間解像度をすべて知っている場合は、次のように実行できます。common_type
以下に示すように、さまざまな時間分解能のすべてで使用することにより、正しいティック期間を把握できます。
#include <cstdint>
#include <chrono>
struct clock
{
typedef std::uint64_t rep;
typedef std::common_type
<
std::chrono::duration<rep, std::ratio<1, 50>>,
std::chrono::duration<rep, std::ratio<1, 30>>,
std::chrono::duration<rep, std::ratio<1001, 30000>>
>::type duration;
typedef duration::period period;
typedef std::chrono::time_point<clock> time_point;
static const bool is_steady = true;
static time_point now()
{
// just as an example
using namespace std::chrono;
return time_point(duration_cast<duration>(steady_clock::now().time_since_epoch()));
}
};
これにより、コンパイル時に、指定した各解像度を正確に表す最大のティック期間が計算されます。たとえば、この時計では次のことを正確に表すことができます。
- 600 ティックで 1/50。
- 1000 ティックで 1/30。
- 1001 ティックで 1001/30000。
以下のコードはこれを実行し、ここでclock
説明されている「chrono_io」機能を使用して、クロックの実行時のティック数だけでなく、クロックティックのコンパイル時の単位も出力します。
#include <iostream>
#include <thread>
#include "chrono_io"
int main()
{
auto t0 = clock::now();
std::this_thread::sleep_for(std::chrono::milliseconds(20));
auto t1 = clock::now();
std::cout << (t1-t0) << '\n';
}
私にとって、これは次のように出力されます:
633 [1/30000]seconds
意味: への呼び出しの間に 633 クロック ティックがありnow()
、各ティックの単位は 1/30000 秒です。「chrono_io」に縛られたくない場合は、 と を使用して時計の単位を調べることができclock::period::num
ますclock::period::den
。
異なる時間解像度がコンパイル時の情報でない場合は、現在のソリューションboost::rational
がおそらく最適です。