std::ratio是编译期最简整数比类型,仅含静态常量num/den,不可运算或赋值;需用ratio_add等元函数组合,适用于chrono单位标签而非运行时分数计算。
std::ratio 是编译期有理数,不是运行时分数类型
std::ratio 是 C++11 引入的模板别名族,用于在编译期表示**最简整数比**(如 1/1000、3/4),它不存储值,只携带 Numerator 和 Denominator 两个静态常量。你不能用它做 a + b 运算,也不能赋值给变量——它本质是类型,不是对象。
常见误用:试图写 auto r = std::ratio{}; 或 std::ratio + std::ratio,这会编译失败。加减乘除需靠 std::ratio_add、std::ratio_multiply 等配套模板元函数,返回的是新类型。
用 std::ratio_multiply 实现单位换算(如 ms → s)
标准库已预定义常用比例,比如 std::milli 就是 std::ratio,std::kilo 是 std::ratio。单位换算本质是比例相乘:
-
std::milli::num是 1,std::milli::den是 1000,表示 1 毫秒 = 1/1000 秒 - 要把毫秒转为秒,即乘以
std::milli,所以std::ratio_multiply, std::milli>得到std::ratio - 若要算 “500 毫秒是多少微秒”,就是
std::ratio_multiply, std::micro>?错——std::micro是 1e-6,而毫秒是 1e-3,正确做法是std::ratio_multiply(因为 1 ms = 1000 μs)
实际换算中,应始终用标准 ratio 类型组合,而非手算分子分母。例如:
立即学习“C++免费学习笔记(深入)”;