如何通过std::ratio实现编译时单位转换且实现零开销常量计算?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1143个文字,预计阅读时间需要5分钟。
它不是运行时工具,而是编译期有理数类型模板——`std::ratio`。
常见错误是把它当普通数值用:auto r = std::ratio{} * 1000; —— 错,std::ratio 没重载 * 运算符,也不能和整数直接运算;它只参与类型计算,不参与值计算。
- 必须配合
std::ratio_add、std::ratio_multiply等元函数操作类型 - 最终要靠
std::ratio<N,D>::num和std::ratio<N,D>::den取出编译期常量 - 所有输入必须是字面量整型常量(
constexpr),不能是变量或运行时读入的值
怎么把毫秒转纳秒?用 std::ratio_multiply 搭配 std::nano
标准库已定义好常用单位:比如 std::milli 是 std::ratio<1, 1000>,std::nano 是 std::ratio<1, 1000000000>。毫秒→纳秒本质是乘以 1000000,即 milli / nano 的比值。
本文共计1143个文字,预计阅读时间需要5分钟。
它不是运行时工具,而是编译期有理数类型模板——`std::ratio`。
常见错误是把它当普通数值用:auto r = std::ratio{} * 1000; —— 错,std::ratio 没重载 * 运算符,也不能和整数直接运算;它只参与类型计算,不参与值计算。
- 必须配合
std::ratio_add、std::ratio_multiply等元函数操作类型 - 最终要靠
std::ratio<N,D>::num和std::ratio<N,D>::den取出编译期常量 - 所有输入必须是字面量整型常量(
constexpr),不能是变量或运行时读入的值
怎么把毫秒转纳秒?用 std::ratio_multiply 搭配 std::nano
标准库已定义好常用单位:比如 std::milli 是 std::ratio<1, 1000>,std::nano 是 std::ratio<1, 1000000000>。毫秒→纳秒本质是乘以 1000000,即 milli / nano 的比值。

