gpt4 book ai didi

c++ - 子类化std::chrono::duration

转载 作者:行者123 更新时间:2023-12-02 09:53:51 25 4
gpt4 key购买 nike

我有一段代码,其中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时,这似乎可以编译并且可以正常工作。但是,在使用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



在以下链接中可以看到,该链接还演示了clang给出了相同的错误: https://wandbox.org/permlink/CQw6fWt4kZ1xYdet

在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子类传递静态断言?

最佳答案

std::time_point始终要求持续时间类型为std::duration的特殊化。如果不是,则程序格式不正确(又称:编译错误)。这可能只是GCC首次执行该要求。

duration派生实际上并没有任何有用的目的。

关于c++ - 子类化std::chrono::duration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62045915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com