Проблема с написанием функции для преобразования времени

Рейтинг: 0Ответов: 1Опубликовано: 11.07.2023

У меня мало опыта в C++ и библиотека chrono показалась сложноватой для восприятия, поэтому решил немного упростить и убрать boiler-plate. Класс EpochTime должен предоставлять время с начала эпохи, выраженное в разных временных промежутках. Уже есть приватный метод для получения наносекунд. Нужно написать метод для преобразования наносекунд в данную единицу измерения:

#include <iostream>
#include <chrono>

class EpochTime {
private:
    static std::chrono::nanoseconds since_epoch()
    {
        return std::chrono::high_resolution_clock::now().time_since_epoch();
    }
    static long get(? duration_unit)//
    {   /**
        duration_unit: std::chrono::milliseconds,
                       std::chrono::microseconds,
                       std::chrono::nanoseconds
        и так далее...
        */
        return ?;
    }

public:
    static long hours()        { return EpochTime::get(std::chrono::hours);        }
    static long minutes()      { return EpochTime::get(std::chrono::minutes);      }
    static long seconds()      { return EpochTime::get(std::chrono::seconds);      }
    static long milliseconds() { return EpochTime::get(std::chrono::milliseconds); }
    static long microseconds() { return EpochTime::get(std::chrono::microseconds); }
    static long nanoseconds()  { return EpochTime::get(std::chrono::nanoseconds);  }
};

int main()
{
    std::cout << EpochTime::hours();
    return 0;
}

duration_unit - собственно единица измерения из chrono. Возникает вопрос о типе этого аргумента и как правильно его передать в duration_cast.

Ответы

▲ 1Принят
#include <chrono>
#include <iostream>

template <typename Duration>
auto now() {
    auto _now = std::chrono::system_clock::now();
    return std::chrono::time_point_cast<Duration>(_now).time_since_epoch().count();
}

auto hours() {  return now<std::chrono::hours>(); }
auto nanoseconds() { return now<std::chrono::nanoseconds>(); }

int main() {
    std::cout << hours() << std::endl;
    std::cout << nanoseconds() << std::endl;
}