原 总结 ratio 

概览

std::ratio定义在<ratio>文件中,提供了编译期的比例计算功能。为std::chrono::duration提供基础服务。

类定义

std::ratio是一个模板类,关键代码摘录如下(格式有调整):

  1. template<intmax_t _Nx, intmax_t _Dx = 1> 

  2. struct ratio 



  3. static_assert(_Dx != 0, "zero denominator"); 

  4. static_assert(-INTMAX_MAX <= _Nx, "numerator too negative"); 

  5. static_assert(-INTMAX_MAX <= _Dx, "denominator too negative"); 


  6. static constexpr intmax_t num = _Sign_of<_Nx>::value 

  7. * _Sign_of<_Dx>::value * _Abs<_Nx>::value / _Gcd<_Nx, _Dx>::value; 


  8. static constexpr intmax_t den = _Abs<_Dx>::value / _Gcd<_Nx, _Dx>::value; 


  9. typedef ratio<num, den> type; 

  10. }; 

第一个参数_Nx代表了分子,第二个参数 _Dx代表了分母。

num是计算后的分子,den是计算后的分母。在duration转换的时候会用到这两个值。

注:这里的计算是指约分,可以看到传入的分子和分母都除以了最大公约数。

numnumerator的缩写,表示分子。

dendenominator的缩写,表示分母。

预定义ratio

为了方便代码的书写,标准库提供了如下定义:

Type Definition
yocto std::ratio<1, 1000000000000000000000000>, if std::intmax_t can represent the denominator
zepto std::ratio<1, 1000000000000000000000>, if std::intmax_t can represent the denominator
atto std::ratio<1, 1000000000000000000>
femto std::ratio<1, 1000000000000000>
pico std::ratio<1, 1000000000000>
nano std::ratio<1, 1000000000>
micro std::ratio<1, 1000000>
milli std::ratio<1, 1000>
centi std::ratio<1, 100>
deci std::ratio<1, 10>
deca std::ratio<10, 1>
hecto std::ratio<100, 1>
kilo std::ratio<1000, 1>
mega std::ratio<1000000, 1>
giga std::ratio<1000000000, 1>
tera std::ratio<1000000000000, 1>
peta std::ratio<1000000000000000, 1>
exa std::ratio<1000000000000000000, 1>
zetta std::ratio<1000000000000000000000, 1>, if std::intmax_t can represent the numerator
yotta std::ratio<1000000000000000000000000, 1>, if std::intmax_t can represent the numerator

应用

如果想表示1/5,那么可以这样写std::ratio<1, 5>

回想我们在学习std::chrono::duration中遇到到的milli的定义:

typedef ratio<1, 1000> milli;,表示一千分之一,因为约定了基本计算单位是,所以milli表示一千分之一秒。

示例代码

  1. #include <iostream> 

  2. #include <chrono> 


  3. typedef std::chrono::duration<float, std::ratio<3, 1> > three_seconds; 

  4. typedef std::chrono::duration<float, std::ratio<1, 10> > one_tenth_seconds; 


  5. int main() 



  6. three_seconds s = std::chrono::duration_cast<three_seconds>(one_tenth_seconds(3)); 

  7. std::cout << "3 [1/10 seconds] equal to " << s.count() << " [3 seconds]\n"; 

  8. std::cin.get(); 



参考资料

最新文章

  1. OpenCASCADE DataExchange DWG
  2. JQuery_DOM 简介/设置元素及内容
  3. tableView设置首尾
  4. sizeof运算符和strlen函数的区别
  5. Swift3.0基础语法学习&lt;五&gt;
  6. ruby -- 进阶学习(十二)fragment cache
  7. 利用LM神经网络和决策树去分类
  8. CSS3 图片悬浮缩放效果
  9. ArcGIS 10 影像去黑边
  10. 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good
  11. EffectiveC#6--区别值类型数据和引用类型数据
  12. 认识&lt;meta&gt;
  13. 你不得不知的逻辑或(||)与(&amp;&amp;)非(!)
  14. 使用 qemu 搭建内核开发环境
  15. 马拉车算法——边界拓展时加限制hdu4513
  16. OC仿支付宝输入UITextField输入车牌号
  17. 基于 Promise 的 HTTP 请求客户端 axios
  18. WAP网站WML或HTML页面自适应手机屏幕实现方法
  19. springboot-14-自定义properties文件值注入javaBean中
  20. Laravel框架初学一路由(基本路由)

热门文章

  1. HDU 4901 多校4 经典计数DP
  2. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-map-marker
  3. android 开发学习
  4. 小程序分享H5页面
  5. POJ 1004:Financial Management
  6. PHP常用的数学函数和字符串函数
  7. 发送邮件的几种方法(C#发邮件 和 js前台实现都有)C#后台自动发邮件 js发邮件
  8. mysql 如何删除数据库中所有的表
  9. JS事件-对象监视事件,事件触发函数
  10. hadoop搭建一:虚拟机网络配置和基础(未完成)