2016-05-24 66 views
1

即使只是想上手,我得到一個錯誤與此代碼:如何編寫一個函數,該函數需要任何std :: chrono :: duration(1ms,4s,7h)並將秒作爲浮點數來獲取?

note: candidate template ignored: could not match 'double' against 'long' 

::

#include <numeric> 
#include <chrono> 
using namespace std::chrono_literals; 

// how to write a function that will take any duration and turn it 
// into a float representation of seconds? 
template <class T> 
void go(std::chrono::duration<double, T> d) { 

    // what I want to do (that may not work because I haven't gotten this far): 
    float seconds = std::chrono::duration_cast<std::chrono::seconds>(d); 
} 

int main() 
{ 
    go(1ms); 
    go(1s); 
} 

回答

3

我只能猜測你要完成什麼,這裏是我最好的猜測:

#include <chrono> 
#include <iostream> 
using namespace std::chrono_literals; 

void go(std::chrono::duration<float> d) { 
    std::cout << d.count() << '\n'; 
} 

int main() 
{ 
    go(1ms); 
    go(1s); 
} 

此輸出:

0.001 
1 
+0

'count'似乎並沒有被很好地命名。 :) –

+1

我有一個函數,在超時時創建,只是想能說.timeout(1ms)或超時(1min)。我不知道你可以接受它作爲一個持續時間。這使事情變得更好,而不必使用模板。 – xaxxon

+0

這是爲什麼這樣工作:當不是'duration '的'duration '被傳遞給'go()'時,編譯器試圖使用'duration '將持續時間轉換爲時間長度 _converting構造函數_。持續時間的轉換構造函數之一是模板化的,以接受任何類型的持續時間。這是用來將'持續時間'轉換成'持續時間',然後一切按預期工作。 – md5i

0
template<typename duration_t> float seconds(const duration_t &d); 

template<class Rep, class Period> 
float seconds(const std::chrono::duration<Rep, Period> &d) 
{ 
    typedef std::chrono::duration<Rep, Period> duration_t; 

    auto one_second=std::chrono::duration_cast<duration_t> 
        (std::chrono::seconds(1)).count(); 

    if (one_second == 0) 
     return d.count() * 
      std::chrono::duration_cast<std::chrono::seconds> 
       (duration_t(1)).count(); 
    else 
     return float(d.count())/one_second; 
} 
+0

我不太明白你正在採取的步驟 - 它佔的東西theother解決方案(特別是霍華德的)不? – xaxxon

2

演員浮動和呼叫計數():

#include <iostream> 
#include <numeric> 
#include <chrono> 

template< class T, class P > 
float to_secs(std::chrono::duration< T, P > t) 
{ 
    std::chrono::duration<float> f = t; 
    return f.count(); 
} 

int main(int argc, char*argv[]) 
{ 
    std::cout << to_secs(std::chrono::milliseconds(1)) << std::endl; 
    std::cout << to_secs(std::chrono::minutes(1)) << std::endl; 
    std::cout << to_secs(std::chrono::hours(1)) << std::endl; 
    // output: 
    // 0.001 
    // 60 
    // 3600 
    return 0; 
} 
+0

我不明白你爲什麼必須模仿第一個參數,而不是僅僅說'浮動' - 尤其是考慮到霍華德的解決方案如何工作。 – xaxxon

相關問題