子类 std::chrono::duration

问题描述 投票:1回答:1

我有一段代码,其中 std::chrono::duration<int64_t, std::milli> 的子类,并用于创建一个包含在其中的 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时,在std::chrono::time_point中的静态断言会失败。

optwandboxgcc-headincludec++11.0.0chrono:764:37: error: static assertion failed: duration must be a specialization of std::chronono::duration

这可以在下面的链接中看到,它也证明了clang给出了同样的错误。https:/wandbox.orgpermlinkCQw6fWt4kZ1xYdet

在std::chrono中,失败的断言是由于 __is_duration 的结构。time_point:

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 导致静态断言失败。

所以,我的问题是:这是否意味着不可能将std::chrono::duration子类与time_point一起使用派生类?还是有什么技巧可以让duration子类通过静态断言?

c++ chrono
1个回答
3
投票

std::time_point 一直以来都要求duration类型是一个特殊化的 std::duration. 如果没有,那么程序就是不正规的(也就是:编译错误)。这可能只是GCC第一次实现这个要求。

duration 并没有真正起到任何有用的作用。

© www.soinside.com 2019 - 2024. All rights reserved.