Как сохранить хронографическое время в списке в C ++

Я работаю над кодом C ++, где я пытаюсь сохранить chrono time в списке, чтобы я мог прочитать значение позже и вычислить продолжительность времени.

Причина экономии времени в списке заключается в том, что у меня есть несколько объектов, где мне нужно зафиксировать текущее время, когда этот объект был обнаружен, а затем, когда этот объект исчезнет, ​​я должен рассчитать продолжительность времени для этого объекта.

list <double> dTimeList;

auto start = std::chrono::high_resolution_clock::now();

auto it = dTimeList.begin();
advance(it, detection.object_id);

dTimeList.insert(it, start ); //But this is giving error

Ошибка (активна) E0304 нет экземпляра перегруженной функции "std :: list‹ _Ty, _Alloc> :: insert [with _Ty = double, _Alloc = std :: allocator] "соответствует списку аргументов

Ошибка C2664 'std :: _ List_iterator >> std :: list ‹_Ty, std :: allocator ‹_Ty>> :: insert (std :: _ List_const_iterator >>, unsigned __int64, const _Ty &)': невозможно преобразовать аргумент 2 из ' std :: chrono :: stable_clock :: time_point 'до' _Ty && '


person S Andrew    schedule 23.05.2019    source источник
comment
Какой тип dTimeList?   -  person Holt    schedule 23.05.2019
comment
@Holt Извините, я обновил тип.   -  person S Andrew    schedule 23.05.2019
comment
Вам необходимо сохранить в списке правильный тип, то есть std::chrono::high_resolution_clock::time_point, а не double. std::chrono::time_point не могут быть неявно преобразованы в числовые типы по уважительным причинам.   -  person Holt    schedule 23.05.2019


Ответы (3)


Здесь неправильно использовать list<double>. Вам нужно сохранить список типа list<decltype(start)>, который совпадает с list<std::chrono::time_point<std::chrono::high_resolution_clock>>. Следующий код должен работать:

auto start = std::chrono::high_resolution_clock::now();
list <decltype(start)> dTimeList;

auto it = dTimeList.begin();
advance(it, detection.object_id);
dTimeList.insert(it, start );

Обратите внимание, что я изменил порядок или объявление списка и start. Конечно, вы также можете использовать какой-нибудь _6 _ / _ 7_ декларатор.

И, наконец, для полноты, high_resolution_clock имеет собственный псевдоним для указанного выше типа, _9 _.

person andreee    schedule 23.05.2019

std::chrono::high_resolution_clock::now() возвращает экземпляр

std::chrono::high_resolution_clock::time_point

... который по уважительным причинам не может быть преобразован в double. Если вы хотите хранить временные точки, вам нужен соответствующий список:

std::list<std::chrono::high_resolution_clock::time_point> dTimeList;
person Holt    schedule 23.05.2019

Как указано в комментариях: «Вам необходимо сохранить в своем списке правильный тип, то есть std :: chrono :: high_resolution_clock :: time_point, а не double. Std :: chrono :: time_point не могут неявно преобразовываться в числовые типы. по уважительным причинам ".

Ниже я привел небольшой рабочий пример:

#include <iostream>
#include <chrono>
#include <vector>
#include <thread>

int main()
{
    std::vector<std::chrono::time_point<std::chrono::system_clock>> dTimeList;

    dTimeList.push_back(std::chrono::high_resolution_clock::now());
    std::this_thread::sleep_for (std::chrono::seconds(1));
    dTimeList.push_back(std::chrono::high_resolution_clock::now());

    std::chrono::duration<double> difference = dTimeList[0]-dTimeList[1];
    std::cout << "Time difference is: " << difference.count() << std::endl;
    return 0;
}
person Lukas Nolte    schedule 23.05.2019