Функция для возврата chrono :: duration, используя шаблоны для единицы времени

0

Я новичок в шаблонах C++, и я пытаюсь написать функцию, которая возвращает chrono :: duration с указанной единицей времени и типом. Например, эта строка дает мне разницу во времени в секундах как двойную:

std::chrono::duration<double> secd =
     std::chrono::duration_cast<std::chrono::duration<double,std::ratio<1>>>(end - start);

У меня есть функция класса, которая дает мне продолжительность времени, и я хотел бы использовать шаблоны для указания типа и единицы для возвращаемого значения (в предыдущем примере это было бы double и ratio <1>). То, что я хотел бы иметь, похоже на этот псевдокод:

template typename<class T, class R> std::chrono::duration<T, R> getStepTime() {
    return std::chrono::duration_cast<std::chrono::duration<T, R>>(_time);
}

где _time - член класса с продолжительностью. Все мои попытки до сих пор даже не собирались.

Если есть лучший способ достичь этого, не используя шаблоны, я все уши.

  • 0
    Если вы хотите универсальность в типе возврата, вам нужны шаблоны!
Теги:
templates
time
chrono

2 ответа

1
Лучший ответ

Плохое использование typename и отсутствующее закрытие > в вашем шаблоне. Вот скриншоты для тестирования компиляции:

template <typename T, typename R> 
std::chrono::duration<T, R> getStepTime() 
{
    std::chrono::duration<T, R> duration;
    return std::chrono::duration_cast<std::chrono::duration<T, R>>(duration);
}

http://ideone.com/QGYm8u

  • 0
    Оба ответа работают, спасибо всем! :) Я просто хотел сказать (для будущих гуглеров), что, поскольку моя функция была внутри класса, мне пришлось поместить шаблонный код в заголовок, иначе он не скомпилируется.
1

Плохое использование ключевого слова typename; пытаться

template<typename T, typename R> 
std::chrono::duration<T, R> getStepTime(Step step) {
   return
     std::chrono::duration_cast<std::chrono::duration<T, R>>(_time);
}

но вы должны показать больше кода. Ваш пример слишком мал, чтобы быть даже проверенным.

  • 0
    спасибо, исправлено!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню