У меня есть фрагмент кода, в котором 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{} );
//....
}
По-видимому, это компилируется и работает нормально при использовании G CC <10. Однако при использовании G CC 10 утверждение stati c в std :: chrono :: time_point завершится ошибкой: </p>
/ opt / wandbox / g cc - head / include / c ++ / 11.0.0 / chrono: 764: 37: error: static assertion failed: duration должно быть специализацией 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
, что приведет к сбою stati c assert.
Итак, мой вопрос: означает ли это невозможно создать подкласс std :: chrono :: duration и использовать производный класс с time_point? Или есть какой-то трюк, который позволит подклассу длительности передать утверждение stati c?