子类化 std::chrono::duration
Subclassing std::chrono::duration
我有一段代码,其中 std::chrono::duration<int64_t, std::milli>
被子 classed,并用于创建 std::chrono::time_point
,像这样:
#include <chrono>
class my_duration : public std::chrono::duration<int64_t, std::milli>
{ /* snip */ };
int main()
{
typedef std::chrono::time_point< std::chrono::system_clock, my_duration > my_time_point;
my_time_point t( my_duration{} );
//....
}
当使用 GCC < 10 时,这似乎可以编译并且工作正常。但是,当使用 GCC 10 时,std::chrono::time_point 中的静态断言将失败并显示:
/opt/wandbox/gcc-head/include/c++/11.0.0/chrono:764:37: error: static
assertion failed: duration must be a specialization of
std::chrono::duration
这个可以看下面link,也说明clang报同样的错误:https://wandbox.org/permlink/CQw6fWt4kZ1xYdet
在 std::chrono 中,失败的断言是由于 time_point
使用的 __is_duration
结构:
template<typename _Tp>
struct __is_duration
: std::false_type
{ };
template<typename _Rep, typename _Period>
struct __is_duration<duration<_Rep, _Period>>
: std::true_type
{ };
//... further down, in time_point:
static_assert(__is_duration<_Dur>::value,
"duration must be a specialization of std::chrono::duration");
我的理解是 __is_duration<my_duration>
将是一个 std::false_type
导致静态断言失败。
所以,我的问题是:这是否意味着无法子class std::chrono::duration 并将派生的class 与time_point 一起使用?或者是否有一些技巧可以让持续时间 subclass 通过静态断言?
std::time_point
一直要求持续时间类型是 std::duration
的特化。如果不是,则程序格式错误(又名:编译错误)。这可能只是 GCC 第一次实施该要求。
从 duration
派生并没有真正起到任何有用的作用。
我有一段代码,其中 std::chrono::duration<int64_t, std::milli>
被子 classed,并用于创建 std::chrono::time_point
,像这样:
#include <chrono>
class my_duration : public std::chrono::duration<int64_t, std::milli>
{ /* snip */ };
int main()
{
typedef std::chrono::time_point< std::chrono::system_clock, my_duration > my_time_point;
my_time_point t( my_duration{} );
//....
}
当使用 GCC < 10 时,这似乎可以编译并且工作正常。但是,当使用 GCC 10 时,std::chrono::time_point 中的静态断言将失败并显示:
/opt/wandbox/gcc-head/include/c++/11.0.0/chrono:764:37: error: static assertion failed: duration must be a specialization of std::chrono::duration
这个可以看下面link,也说明clang报同样的错误:https://wandbox.org/permlink/CQw6fWt4kZ1xYdet
在 std::chrono 中,失败的断言是由于 time_point
使用的 __is_duration
结构:
template<typename _Tp>
struct __is_duration
: std::false_type
{ };
template<typename _Rep, typename _Period>
struct __is_duration<duration<_Rep, _Period>>
: std::true_type
{ };
//... further down, in time_point:
static_assert(__is_duration<_Dur>::value,
"duration must be a specialization of std::chrono::duration");
我的理解是 __is_duration<my_duration>
将是一个 std::false_type
导致静态断言失败。
所以,我的问题是:这是否意味着无法子class std::chrono::duration 并将派生的class 与time_point 一起使用?或者是否有一些技巧可以让持续时间 subclass 通过静态断言?
std::time_point
一直要求持续时间类型是 std::duration
的特化。如果不是,则程序格式错误(又名:编译错误)。这可能只是 GCC 第一次实施该要求。
从 duration
派生并没有真正起到任何有用的作用。