Принятие std:: chrono:: продолжительность любого представления/периода

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

Например:

transition->after(chrono::seconds(3));
transition->after(chrono::milliseconds(500));
transition->after(chrono::hours(1));

Как бы выглядела действительная подпись для этой функции after? Могу ли я использовать шаблонную функцию?

Ответ 1

Существует несколько общих опций

1) Используйте шаблон. Это имеет то преимущество, что конверсии нет, но требует использования шаблона, что может быть невозможно. Например, если это интерфейс для виртуальной функции.

template<typename Rep, typename Period>
void after( std::chrono::duration< Rep, Period > t);

2) Используйте целочисленное представление и самый низкий период, необходимый для вашего интерфейса. Например, если ваша функция реалистично нужна только наносекундам, вы можете использовать ее напрямую. Это неявно преобразуется в наносекунды, если не произойдет никакой потери точности. Вы можете указать другие периоды с использованием заранее определенных или явно указать его как часть продолжительности

void after( std::chrono::nanoseconds t) ;

3) Используйте двойное представление, которое может быть полезно, если точность не является проблемой, но возможность принимать все входные данные. Это будет неявно конвертировать любую продолжительность, так как преобразование в тип с плавающей точкой разрешено для всех периодов. Например, если вам нужны секунды с двойной точностью, вы сделали бы

void after( std::chrono::duration< double > t);