using namespace
のファイルスコープでの使用、特にヘッダーの使用を妨げることに熱狂する理由があります。しかし、の機能範囲では、特に<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 :: chrono :: seconds'? – nwp
関数を書く? –
ローカルスコープ内で、または他のエイリアスを使用している 'namespace std :: chrono;'でしょうか? – Akira