PrintDuration
タスクにかかった時間を印刷し、ユーザーが印刷する単位を指定できる関数が欲しかったのです。使用例:
auto start = std::chrono::system_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(3));
PrintDuration<std::chrono::microseconds>(std::cout, start, "Waited for:");
そしてそれは次のようなものを印刷します:"Waited for: 3000000μs\n"
私の質問は、ユーザーが提供したユニットを見つける方法です。
現在、私は以下を使用しています:
template <class T>
std::intmax_t GetNum(const T& duration)
{
return T::period::num;
}
template <class T>
std::intmax_t GetDen(const T& duration)
{
return T::period::den;
}
typedef std::chrono::time_point<std::chrono::system_clock> TimePoint_t;
template <class Duration = std::chrono::seconds>
void PrintDuration(std::ostream& output,
const TimePoint_t& start,
std::string message)
{
auto duration = std::chrono::system_clock::now() - start;
auto convertedDuration = std::chrono::duration_cast<Duration>(duration);
auto count = convertedDuration.count();
std::string units("");
if (GetNum(convertedDuration) == 1)
{
if (GetDen(convertedDuration) == std::nano::den)
units = "ns";
else if (GetDen(convertedDuration) == std::micro::den)
units = "\u03BCs"; // us
else if (GetDen(convertedDuration) == std::milli::den)
units = "ms";
else if (GetDen(convertedDuration) == 1)
units = "s";
else
units = "";
}
else if(GetDen(convertedDuration) == 1)
{
if (GetNum(convertedDuration) == 60)
units = "m";
else if (GetNum(convertedDuration) == 3600)
units = "h";
else
units = "";
}
output << message << ' ' << count << units << '.' << std::endl;
}
それは問題なく機能しますが、かなり冗長に見えます。C ++のドキュメントを調べましたが、見つかりませんでした。どんな助けでも大歓迎です。