在文件範圍內,特別是在頭文件中,不鼓勵使用using namespace
s是很有原因的。但是,在函數範圍內,尤其是<chrono>
lib,using namespace std::chrono
是您的朋友。
只是這一步讓你從:
double period_in_seconds = 3.4;
auto as_duration = std::chrono::duration_cast<std::chrono::steady_clock::duration>(std::chrono::duration<double>(period_in_seconds));
到:
double period_in_seconds = 3.4;
using namespace std::chrono;
auto as_duration = duration_cast<steady_clock::duration>(duration<double>(period_in_seconds));
我建議使用round
從浮點持續時間轉換成一整體的持續時間時。這不僅會更頻繁地給出「預期」的答案,而且會比duration_cast
略少。 std::chrono::round
是C++ 17的新增功能。但是你可以從here或here等不同位置抓取它,並立即開始使用它。此外,如果你使用{}
對構造它有助於從函數調用區分對象的構造,使代碼更易於閱讀:
double period_in_seconds = 3.4;
using namespace std::chrono;
auto as_duration = round<steady_clock::duration>(duration<double>{period_in_seconds});
最後,不要猶豫,創建自定義的持續時間,即使在局部範圍以提高可讀性:
double period_in_seconds = 3.4;
using namespace std::chrono;
using dsec = duration<double>;
auto as_duration = round<steady_clock::duration>(dsec{period_in_seconds});
編輯:如果因爲某些原因(比如放錯了地方風格指南),你不能使用函數本地using namespace std::chrono
,那麼你就可以彌補與更多的特定類型的別名並使用聲明:
double period_in_seconds = 3.4;
using dsec = std::chrono::duration<double>;
using duration = std::chrono::steady_clock::duration;
using std::chrono::round;
auto as_duration = round<duration>(dsec{period_in_seconds});
如果這個代碼的目的是在文件範圍內,你不想在文件範圍,這些usings(這是完全可以理解的),只需創建一個函數來封裝它們:
constexpr
std::chrono::steady_clock::duration
get_period(double period_in_seconds)
{
using dsec = std::chrono::duration<double>;
using duration = std::chrono::steady_clock::duration;
using std::chrono::round;
return round<duration>(dsec{period_in_seconds});
}
auto constexpr as_duration = get_period(3.4);
上面我甚至已經證明,這個特定的例子都可以在編譯時完成。 clang -O3 -S
降低上述下降到下面的組件:
.globl _as_duration ## @as_duration
.p2align 3
_as_duration:
.quad 3400000000 ## 0xcaa7e200
'的std ::計時:: seconds'? – nwp
編寫一個函數? –
也許在本地範圍內使用namespace std :: chrono;或使用其他別名? – Akira