[英]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);
說明 :除非
ToDuration
是duration
的實例化,否則此函數不得參與重載解析。
如果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);
備注:除非
ToDuration
是duration
的實例化,否則此函數不得參與重載解析。
從函數調用的參數類型推導模板參數時,將考慮基類模板的專業化[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_cast
並using my_namespace::duration_cast
到您的命名空間,然后使用該調用進行限定。 (在示例中,您沒有使用名稱空間,因此只需要using std
…。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.