簡體   English   中英

std::chrono::duration 作為方法參數傳遞

[英]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.

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