2016-11-14 28 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'。其次,可以將其製作成模板+ typedefs。第三,使用持續時間的'rep_type'而不是硬編碼的'int'。 –

+0

好的建議,謝謝! –