Создание подкласса std :: chrono :: duration - PullRequest
1 голос
/ 27 мая 2020

У меня есть фрагмент кода, в котором 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?

1 Ответ

3 голосов
/ 27 мая 2020

std::time_point всегда требовало, чтобы тип продолжительности был специализацией std::duration. Если это не так, значит программа имеет неправильный формат (также известную как ошибка компиляции). Это может быть первый раз, когда G CC реализует это требование.

Получение из duration на самом деле не служит какой-либо полезной цели.

...