如何将一个 double 转换成 std::chrono::milliseconds

4

我正在使用boost::asio::steady_timer m_timer,如果我没有弄错的话,为了调用m_timer.expires_after(expiration_time_ms);expiration_time_ms应该是一个std::chrono::milliseconds变量。

然而,在我的情况下,过期时间是以double形式给出的。我想知道是否可以将double强制转换为std::chrono::milliseconds

目的是调用

void
setExpirationTime(my_casted_double) {
  boost::asio::steady_timer m_timer;
  m_timer.expires_after(my_casted_double)
}
2个回答

12

一个好的技巧是使用chrono文字将您的数值相乘:

using namespace std::chrono_literals;

double time = 82.0;
auto t_82ms = time * 1ms;
std::this_thread::sleep_for(t_82ms);

它也可以反过来运作:

double time = t_82ms / 1s; // time == 0.082

我尝试了您的建议(似乎已经得到社区的批准),但是我遇到了以下错误:错误:从“duration<double,[...]>”到“const duration<long long,[...]>”没有可行的转换 const std::chrono::milliseconds my_time = my_double * 1ms; - bellotas
1
my_time 应该是 std::chrono::duration 类型(或者只需保留 auto)。 - m88
1
@m88 boost::asio::steady_timer::expires_after 不接受浮点数持续时间,除非进行显式转换。 - Alan Birtles

4

m_timer.expires_after 可以接受任何可转换为 boost::asio::steady_timer::duration 的持续时间, 不一定是 std::chrono::milliseconds (如果您不想丢失持续时间的小数毫秒,就不应该转换为 std::chrono::milliseconds )。

您可以按以下方式将您的 double 转换为 std::chrono::duration

double milliseconds = 0.1;
std::chrono::duration<double, std::milli> chrono_milliseconds{ milliseconds };

chrono_milliseconds 无法自动转换为整数的持续时间类型 expires_after,因为浮点型与整型之间没有自动转换机制。您可以通过使用 std::chrono::duration_cast 解决这个问题:

m_timer.expires_after(
  std::chrono::duration_cast<boost::asio::steady_timer::duration>(chrono_milliseconds));

这绝对是正确的答案,因为我已经在处理来自我的计时器的错误。 - bellotas
这可能是使用 ceil 替换 duration_cast 的好地方。不同之处在于,ceil 会将任何小数毫秒四舍五入到下一个整毫秒,而不是向下。这完全取决于您希望 expires_after 如何处理小数毫秒。 - Howard Hinnant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接