贝利信息

c++中如何使用std::ratio_multiply进行比例乘法_c++编译期计算【汇总】

日期:2026-01-22 00:00 / 作者:穿越時空
std::ratio_multiply是C++11引入的编译期ratio乘法模板别名,用于在类型层面相乘两个std::ratio并自动约简,所有运算在编译期完成且零运行时代价。

std::ratio_multiply 是什么,它真能做编译期比例运算?

是的,std::ratio_multiply 是 C++11 引入的编译期有理数运算工具,用于在类型层面相乘两个 std::ratio,结果仍是 std::ratio 类型,所有计算(分子、分母约分)都在编译期完成,零运行时代价。

它不是函数,而是一个模板别名(C++11 起定义为 template using ratio_multiply = ...),所以不能传变量,只

能传字面量 ratio 类型。

怎么写一个合法的 std::ratio_multiply 表达式?

必须保证两个操作数都是 std::ratio 类型(包括标准库预定义的如 std::milli),且结果可表示为整型常量表达式(即不溢出 intmax_t)。

示例中所有内容都可在 constexpr 上下文使用:

立即学习“C++免费学习笔记(深入)”;

using r1 = std::ratio<2, 3>;
using r2 = std::ratio<5, 4>;
using product = std::ratio_multiply; // 等价于 ratio<10, 12> → 自动约简为 ratio<5, 6>

static_assert(product::num == 5, ""); static_assert(product::den == 6, "");

// 复合使用:毫秒 × 千 = 秒 using ms = std::milli; using k = std::kilo; using ms_times_k = std::ratio_multiply; // milli × kilo = ratio<1, 1> → 1:1,即 1 毫秒 × 1000 = 1 秒 static_assert(ms_times_k::num == 1 && ms_times_k::den == 1, "");

和 std::ratio_add / std::ratio_divide 混用时要注意什么?

它们彼此独立,但组合使用时容易忽略约简时机和中间类型的精度限制。

实际工程中哪些地方真正需要它?

主要出现在单位系统建模、硬件寄存器配置、定时器周期换算等要求**绝对编译期确定性**的场景。

最容易被忽略的一点:std::ratio_multiply 的结果类型名极长(尤其嵌套后),调试时看编译错误信息会非常痛苦;建议始终用 using 给中间结果起短名,并搭配 static_assert 校验关键值。