簡體   English   中英

如何對派生類使用`duration_cast`?

[英]How to use `duration_cast` for a derived class?

我正在使用std::chrono清理計時器類。 除我似乎無法將duration_cast應用於派生類外,其他所有事情都很順利。 好吧,我以不同的方式使它工作,但是我仍然想知道我錯過了什么。

錯誤消息請參見此處

#include <iostream>
#include <chrono>

typedef std::chrono::high_resolution_clock Clock;

class Milliseconds : public std::chrono::milliseconds
{
public:
    typedef std::chrono::milliseconds Base;
    typedef Base::rep Type;

    using Base::Base;
};

inline Milliseconds::Type millisecondsSinceEpoch()
{
    return std::chrono::duration_cast<Milliseconds::Base>(Clock::now().time_since_epoch()).count();
    //duration_cast<Milliseconds> ERROR!
}

int main() {
    using namespace std;
    cout << millisecondsSinceEpoch() << endl;
    return 0;
}

標准duration_cast只能用於轉換為duration的特殊化。 [time.duration.cast] / P1:

 template <class ToDuration, class Rep, class Period> constexpr ToDuration duration_cast(const duration<Rep, Period>& d); 

說明 :除非ToDurationduration的實例化,否則此函數不得參與重載解析。

如果ToDuration不是duration的專業化,則將簽名從過載解析中移除(通過SFINAE或類似技術),並且除非另一個名為duration_cast功能模板可用,否則調用將失敗。

當在代碼中替換duration_cast<Milliseconds>時,Visual C ++ 2015 RC發出以下錯誤:

error C2770: invalid explicit template argument(s) for 'enable_if<std::chrono::_Is_duration<_Ty>::value,_To>::type std::chrono::duration_cast(const std::chrono::duration<_Rep,_Period> &)'

std::chrono::_Is_duration<_Ty>特征是MSVC中使用的標准庫的內部實現細節; 它可以使事情按照標准運行,並使錯誤消息更易於理解:您需要給duration_cast一個模板參數,該參數實際上是std::chrono::duration模板的一種特殊化。 在這種情況下,不考慮派生基關系。

標准(N4431草案)中的[20.12.5.7]具有以下描述:

template <class ToDuration, class Rep, class Period>
  constexpr ToDuration duration_cast(const duration<Rep, Period>& d);

備注:除非ToDurationduration的實例化,否則此函數不得參與重載解析。


從函數調用的參數類型推導模板參數時,將考慮基類模板的專業化[14.8.2.1],但在將參數與類模板部分專業化[14.5.5.1]進行匹配時,則不考慮基類模板的專業化,這就是_Is_duration特性。

您需要提供自己的duration_cast

template< typename my_dest, typename my_source >
my_dest duration_cast( my_source const & value )
    { return duration_cast< my_dest::duration >( value ); }

不允許將其放在namespace std::chrono ,因此您不能將其稱為std::chrono::duration_cast 一種替代方法是using std::chrono::duration_cast using my_namespace::duration_cast using std::chrono::duration_castusing my_namespace::duration_cast到您的命名空間,然后使用該調用進行限定。 (在示例中,您沒有使用名稱空間,因此只需要using std …。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM