std::chrono: добавить пользовательскую продолжительность в time_point

Следующий код компилируется (g++ 4.7.2):

#include <chrono>

typedef std::chrono::duration< double > double_prec_seconds;
typedef std::chrono::time_point< std::chrono::system_clock > timepoint_t;

void do_something( const timepoint_t& tm )
{
    // ...
}

int main( int argc, char** argv )
{
    timepoint_t t0 = std::chrono::system_clock::now();
    timepoint_t t1 = t0 + std::chrono::seconds(3);

    // timepoint_t t3 = t0 + double_prec_seconds(3.14);
   auto t3 = t0 + double_prec_seconds(3.14);

    do_something( t1 );
}

Моя проблема в том, что я не знаю, какой тип у t3. Это не timepoint_t, и если убрать комментарий со строки с явно заданным типом, это не скомпилируется. То же самое с вызовом функции: я не могу вызвать do_something с помощью t3.

Итак, мои вопросы:

  • Почему конвертация не работает?
  • Каков наилучший способ иметь продолжительность секунд с двойной точностью?

Я знаю, что могу использовать такой дополнительный бросок

// this works
timepoint_t t3 = t0 + std::chrono::duration_cast< std::chrono::milliseconds >(double_prec_seconds(3.14));

но я хочу избежать этого.

Заранее спасибо!


person wal-o-mat    schedule 24.02.2013    source источник
comment
Я напечатал тип t3, используя typeid(t3).name(), перенаправив stdout в c++filt, и он сказал std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<double, std::ratio<1l, 1000000l> > >. Просто к вашему сведению.   -  person John Zwinck    schedule 24.02.2013
comment
СПАСИБО за подсказку с инструментом! Я сделал примерно то же самое, только без c++filt и не получил ничего полезного, кроме загадочного имени. c++filt вроде помогает, не знал.   -  person wal-o-mat    schedule 24.02.2013


Ответы (1)


Преобразование завершается неудачно, так как нет преобразования из

std::chrono::time_point< std::chrono::system_clock,
                         std::chrono::system_clock::duration >

to

std::chrono::time_point< std::chrono::system_clock,
                         std::chrono::duration< double > >

Проще всего было бы указать double_prec_seconds в качестве параметра шаблона для time_point, см. std::chrono: :time_point

typedef std::chrono::time_point< std::chrono::system_clock,
                                 double_prec_seconds > timepoint_t;

тогда у вас уже есть правильный тип для t3 и do_something.

person Olaf Dietsche    schedule 24.02.2013
comment
Идеальный! Благодарю вас! Я пытался обеспечить конвертацию, но не подумал о смене своего typedef. Теперь мой код выглядит и работает так, как задумано. - person wal-o-mat; 24.02.2013