2016-11-14 18 views
0

今のところ、ユーザ定義リテラルは、入力パラメータとして限定されたタイプのセットを受け入れます(here参照)。任意の型を入力パラメータとして受け入れる計画はありますか?なぜそうでないのですか?任意のタイプのC++ユーザ定義リテラル

は例えば、私は別の形式(秒、ミリ秒など)でのstd ::クロノ::期間を取得できるようにしたいかもしれません、そしてたぶん、あなたが作ることができ

constexpr double operator"" _s(std::chrono::nanosecond time) 
{ 
    return std::chrono::duration_cast<std::chrono::duration<double, std::chrono::seconds::period>>(time).count(); 
} 

constexpr long operator"" _us(std::chrono::nanoseconds time) 
{ 
    return std::chrono::duration_cast<std::chrono::microseconds>(time).count(); 
} 

// And so on ... 

int main() 
{ 
    auto t0 = std::chrono::high_resolution_clock::now(); 
    // do some stuff 
    auto t1 = std::chrono::high_resolution_clock::now(); 

    std::cout << "Time in seconds : " << (t1 - t0)_s << "s\n"; 
    std::cout << "Time in microseconds : " << (t1 - t0)_us << "µs\n"; 

    return 0; 
} 
+9

(T1 - T0)は'リテラル式ではありません。要するに、ユーザー定義のリテラルは、*リテラル*ではないため、他の引数はありません。 –

+0

言葉遣いは間違っていますが、私はいくつかのタイプの "後置機能"を念頭に置いています。 – Zouch

+1

@Zouch '(t1 -t0)_s'は' std :: chrono :: duration(t1 -t0) 'にどのような利点がありますか?単なる文字数であれば、 '使用する 'ことができるのです。 – Biffen

答えて

0

ような何かをするだろう代わりに、ヘルパーの構造体の使用: `ので、とにかく動作しないでしょう

#include <chrono> 
#include <iostream> 

using namespace std::literals::chrono_literals; 

template <class Duration> 
struct dc { 
    using rep = typename Duration::rep; 
    const std::chrono::nanoseconds time; 
    constexpr dc(std::chrono::nanoseconds time):time(time) { } 
    constexpr operator rep() { 
     return std::chrono::duration_cast<Duration>(time).count(); 
    } 
}; 

using s_ = dc<std::chrono::seconds>; 
using us_ = dc<std::chrono::microseconds>; 

// And so on ... 

template <us_::rep N> 
struct S { 
}; 

int main() 
{ 
    auto t0 = std::chrono::high_resolution_clock::now(); 
    // do some stuff 
    auto t1 = std::chrono::high_resolution_clock::now(); 
    std::cout << "Time in seconds : " << s_(t1 - t0) << "s\n"; 
    std::cout << "Time in microseconds : " << us_(t1 - t0) << "µs\n"; 
    S<us_(10us)> us; 
    (void)us; 
    return 0; 
} 

[live demo]

+3

まず、いくつかの 'const'を振りかける。第二に、それはテンプレート+ typedefにすることができます。第3に、ハードコードされた 'int'ではなく、durationの' rep_type'を使います。 –

+0

良いアドバイス、ありがとう! –

関連する問題