2017-08-25 15 views
1

私はこれを行うことができます。2秒からstd :: chrono :: steady_clock :: durationへの簡潔な変換?

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)); 

しかし、私はあなたがそれは非常にばかげている同意するだろうと確信しています。より軽い方法がありますか?

編集:明らかにusing namespace std::chronoの横にあります。

+4

'std :: chrono :: seconds'? – nwp

+1

関数を書く? –

+0

ローカルスコープ内で、または他のエイリアスを使用している 'namespace std :: chrono;'でしょうか? – Akira

答えて

0

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です。しかし、herehereのようなさまざまな場所から手に入れて、今すぐ使い始めることができます。あなたはコンストラクタのため{}を使用する場合も、それは少し読みやすいコードを作成、関数呼び出しからオブジェクトの構築を区別するのに役立ちます:

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 
関連する問題