Ответ 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);