[英]std::chrono::duration passed as a method parameter
我有這個方法:
string tpToString(const system_clock::time_point &tp)
{
string formatStr { "%Y-%m-%d %H:%M:%S" };
return date::format(formatStr, date::floor<microseconds>(tp) );
}
此方法生成一個字符串,例如:
2021-02-09 20:53:10.123456
那太棒了。 它使用 Howard Hinnant 的日期庫。 我剛剛發現自己遇到了一個實例,如果我提供微秒級的超時,API 會返回錯誤。 它需要毫秒。 所以我可以用第二種方法做到這一點:
string tpToStringInMillis(const system_clock::time_point &tp)
{
string formatStr { "%Y-%m-%d %H:%M:%S" };
return date::format(formatStr, date::floor<milliseconds>(tp) );
}
這樣可行。 但我更喜歡做的是傳遞(作為可選參數)持續時間,如下所示:
string tpToString(const system_clock::time_point &tp, chrono::duration dur = milliseconds)
{
string formatStr { "%Y-%m-%d %H:%M:%S" };
return date::format(formatStr, date::floor<dur>(tp) );
}
但是,這會產生錯誤“沒有匹配的 function 用於調用 'floor'”。 我真的很驚訝它沒有抱怨 function 定義,因為毫秒是 typedef。
建議?
我想我可以通過 lambda,但這開始變得丑陋了。
如果您將tpToString
模板,則可以允許調用者在編譯時選擇准確性。
template <typename FloorType = microseconds>
string tpToString(const system_clock::time_point& tp)
{
string formatStr{ "%Y-%m-%d %H:%M:%S" };
return date::format(formatStr, date::floor<FloorType>(tp));
}
int main()
{
std::cout << tpToString(system_clock::now()) << "\n";
std::cout << tpToString<milliseconds>(system_clock::now()) << "\n";
std::cout << tpToString<seconds>(system_clock::now()) << "\n";
std::cout << tpToString<minutes>(system_clock::now()) << "\n";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.