(QQ:114211200)

std::ratio代表一个比例,或者说比率。其实就是将给定的两个整数分别除以它们的最大公约数得到一个分数(分子及分母)。其定义为(vs2015):

template<intmax_t _Nx, intmax_t _Dx = 1>
struct ratio
{    // holds the ratio of _Nx to _Dxstatic_assert(_Dx != 0, "zero denominator");static_assert(-INTMAX_MAX <= _Nx, "numerator too negative");static_assert(-INTMAX_MAX <= _Dx, "denominator too negative");static constexpr intmax_t num = _Sign_of<_Nx>::value* _Sign_of<_Dx>::value * _Abs<_Nx>::value / _Gcd<_Nx, _Dx>::value;static constexpr intmax_t den = _Abs<_Dx>::value / _Gcd<_Nx, _Dx>::value;typedef ratio<num, den> type;
};

附加部分类型以及宏的定义:

typedef long long          intmax_t;
#define INTMAX_MAX       INT64_MAX

std::ratio具有2个intmax_t的非类型模板参数,_Nx代表分子(numerator),_Dx代表分母(denominator)。_Dx不可以为0,_Nx和_Dx都不可以小于-INTMAX_MAX。

num和den分别代表_Nx和_Dx除以它们的最大公约数得到的商。

类型type代表换算后的ratio类型。因此ratio<1,2>::type、ratio<4,8>::type、ratio<3,6>::type都是相同的类型。

STL还定义了一些类型(vs2013):

typedef ratio<1, 1000000000000000000LL> atto;
typedef ratio<1, 1000000000000000LL> femto;
typedef ratio<1, 1000000000000LL> pico;typedef ratio<1, 1000000000> nano;
typedef ratio<1, 1000000> micro;
typedef ratio<1, 1000> milli;
typedef ratio<1, 100> centi;
typedef ratio<1, 10> deci;
typedef ratio<10, 1> deca;
typedef ratio<100, 1> hecto;
typedef ratio<1000, 1> kilo;
typedef ratio<1000000, 1> mega;
typedef ratio<1000000000, 1> giga;typedef ratio<1000000000000LL, 1> tera;
typedef ratio<1000000000000000LL, 1> peta;
typedef ratio<1000000000000000000LL, 1> exa;

下面看示例代码:

template<typename T>
void output(const T &t)
{cout << typeid(t).name() << ":" << endl;cout << "num:" << t.num << endl;cout << "den:" << t.den << endl;
}void call_by_main()
{ratio<2, 4> r;output(r);ratio<1, 3> r1;output(r1);ratio<3, 6> r3;output(r3);system("pause");
}

输出为:

struct std::ratio<2,4>:
num:1
den:2
struct std::ratio<1,3>:
num:1
den:3
struct std::ratio<3,6>:
num:1
den:2
请按任意键继续. . .

STL还定义了一些辅助运算用的模板类。

其中一些以类型的方式提供了2个ratio类型的各种算数运算结果。注意,是类型的运算,得到的结果当然也是类型,通常为x::type的形式。

另外一些以值的方式提供了2个ratio类型的关系运算结果,这个结果是值,通常为x::value的形式。

这些类型有:

名称 type
ratio_add R1 + R2
ratio_divide R1 / R2
ratio_equal R1 == R2
ratio_greater R1 > R2
ratio_greater_equal R1 >= R2
ratio_less R1 < R2
ratio_less_equal R1 <= R2
ratio_multiply R1 * R2
ratio_not_equal !(R1 == R2)
ratio_subtract R1 - R2

以std::ratio_add来说,它的作用是求出两个ratio类型的和的类型, 它的定义如下:

template<class _R1,class _R2>struct _Ratio_add{    // add two ratiosstatic_assert(_Are_ratios<_R1, _R2>::value,"ratio_add<R1, R2> requires R1 and R2 to be ratio<>s.");static constexpr intmax_t _N1 = _R1::num;static constexpr intmax_t _D1 = _R1::den;static constexpr intmax_t _N2 = _R2::num;static constexpr intmax_t _D2 = _R2::den;static constexpr intmax_t _Gx = _Gcd<_D1, _D2>::value;// typename ratio<>::type is necessary heretypedef typename ratio<_Safe_add<_Safe_mult<_N1, _D2 / _Gx>::value,_Safe_mult<_N2, _D1 / _Gx>::value>::value,_Safe_mult<_D1, _D2 / _Gx>::value>::type type;};template<class _R1,class _R2>using ratio_add = typename _Ratio_add<_R1, _R2>::type;

使用示例:

template<typename T>
void output(const T &t)
{cout << typeid(t).name() << ":" << endl;cout << "num:" << t.num << endl;cout << "den:" << t.den << endl;
}void call_by_main()
{ratio<2, 4> r;output(r);ratio<1, 3> r1;output(r1);//求和的类型:ratio_add<decltype(r), decltype(r1)> sum;output(sum);//第一个类型是否大于第二个类型:using gr = ratio_greater<decltype(r), decltype(r1)>;cout << "gr::value_type:" << typeid(gr::value_type).name() << endl;cout << "gr::value:" << gr::value << endl;system("pause");
}

输出为:

struct std::ratio<2,4>:
num:1
den:2
struct std::ratio<1,3>:
num:1
den:3
struct std::ratio<5,6>:
num:5
den:6
gr::value_type:bool
gr::value:1
请按任意键继续. . .

std::ratio 详解相关推荐

  1. std::ratio详解

    文章目录 std::ratio是什么? 示例代码: std::ratio是什么? std::ratio代表一个比例,或者说比率.其实就是将给定的两个整数分别除以它们的最大公约数得到一个分数(分子及分母 ...

  2. C++11 并发指南三(std::mutex 详解)

    上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...

  3. 【转】C++11 并发指南五(std::condition_variable 详解)

    http://www.cnblogs.com/haippy/p/3252041.html 前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三 ...

  4. C++11 并发指南五(std::condition_variable 详解)

    前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...

  5. C++11 并发指南------std::thread 详解

    参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Int ...

  6. c++ std::move详解

    c++ std::move详解 在移动构造中的时候,移动拷贝其实就是把原来参数对象的指针地址给到了构造的对象,再把原先对象的指针置为NULL,这样内存就不会被原来函数给析构了.对于实体的对象执行的其实 ...

  7. std::tie详解

    std::tie:创建左值引用的 tuple,或将 tuple 解包为独立对象 返回值 含左值引用的 std::tuple 对象. 注意 std::tie 可用于解包 std::pair ,因为 st ...

  8. 【c++】24.std::function和std::bind详解

    1. 可调用对象 查看全文 http://www.taodudu.cc/news/show-494578.html 相关文章: [c++]26.浅谈"事件驱动".select.po ...

  9. std::async()详解

    1.std::async函数原型: template<class Fn, class... Args> future<typename result_of<Fn(Args... ...

最新文章

  1. linux挂在win共享文件
  2. iOS GCD_1
  3. ipad如何连接电脑_指纹打卡机如何连接电脑?怎么导出原始考勤数据记录?
  4. [Android]第四次作业
  5. zigbee zstack 串口,按键,消息,定时器
  6. 区块链 HyperLedger Fabric安装
  7. 重磅!四部委发文,以后买房可以省几十万元!
  8. 内核的Makefile与Kconfig关系解析
  9. Python Windows文件操作
  10. [Ext JS] 组件浮动一篇通(floating、alignTo)
  11. 技术博客2014年3月份头条记录
  12. Unity飞机大战源码下载
  13. 电商挖角潮起:工作两年百万年薪
  14. 怎么查微信聊天记录?我来教你几招,祝你无忧。
  15. heur.riskfm.bbx病毒解决方案--www.baoluowanxiang.com
  16. 从控制台输入一个数字,判断这个数字是不是一个质数
  17. 找不到位于wsd扫描的计算机,在基于 Windows 的计算机上单击新扫描 Windows 传真和扫描时出现错误消息...
  18. 中电智谷济南高铁西站新能源汽车充电站顺利开工
  19. 跟alex学python_跟Alex学Python之
  20. mysql支持多语言_MySQL整理以存储未知语言的多语言数据

热门文章

  1. Arduino STC单片机远程升级(1)单机版 STC_OTA云端升级
  2. 正则十八式-第二式:控鹤擒龙
  3. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于java的仓储信息管理系统o9ypl
  4. LC-初级算法-后续章节
  5. 微信小程序怎么做营销活动_有什么小程序营销活动
  6. python实现简单的猜数字游戏
  7. Linux popen函数的使用总结
  8. onlineSchool 项目课 四 :对项目图片的处理
  9. Shell数组遍历的三种方法及注意事项
  10. Linux内核驱动初探(三) 以太网卡