`
xuning2516
  • 浏览: 8029 次
  • 性别: Icon_minigender_1
  • 来自: 江西
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

C++ ratio

 
阅读更多

C++11提供了compile_time fractions andcompile-time rational arithmetic support。支持编译时常量。


头文件 <ratio>

来看ratio是怎么定义的

00152   template<intmax_t _Num, intmax_t _Den = 1>
00153     struct ratio
00154     {
00155       static_assert(_Den != 0, "denominator cannot be zero");
00156       static_assert(_Num >= -__INTMAX_MAX__ && _Den >= -__INTMAX_MAX__,
00157             "out of range");
00158 
00159       // Note: sign(N) * abs(N) == N
00160       static constexpr intmax_t num =
00161         _Num * __static_sign<_Den>::value / __static_gcd<_Num, _Den>::value;   //是一个静态常量成员变量,注意看他的初始化是在类的定义里面实现的但是在类的外面还是要声明,可以通过类名直接进行访问
00162 
00163       static constexpr intmax_t den =
00164         __static_abs<_Den>::value / __static_gcd<_Num, _Den>::value; //可以看到这个最终的值是经过约分的,其中是gcd求得是两个数的最大公约数
00165 
00166       typedef ratio<num, den> type;
00167     };
00168 
00169   template<intmax_t _Num, intmax_t _Den>
00170     constexpr intmax_t ratio<_Num, _Den>::num;  //ratio的成员函数
00171 
00172   template<intmax_t _Num, intmax_t _Den>
00173     constexpr intmax_t ratio<_Num, _Den>::den;

通过constexpr实现了compile_time 的属性。是一个compile-time constants,可以当成常量来使用。是一个具体类(还有一个具体类pair)。ratiotypes are used as template parameters fordurationobjects

来看看一个调用的例子

	typedef ratio<5,3> FiveThirds;  //注意这是一个类型
	cout<<FiveThirds::num<<"/"<<FiveThirds::den;
	ratio<5,3>::type one;
	cout<<FiveThirds::num<<"/"<<FiveThirds::den;
	typedef ratio<25,15> AlsoFiveThirds; 
	cout<<AlsoFiveThirds::num<<"/"<<AlsoFiveThirds::den;
	ratio<25,15> two;  //注意这是一个对象
	cout<<two.num<<"/"<<two.den<<endl;   //5/3
	//ratio<5,0> three;  //error
//提供如下的操作方法
(C++11)
adds tworatioobjects at compile-time
(class template)
(C++11)
subtracts tworatioobjects at compile-time
(class template)
(C++11)
multiplies tworatioobjects at compile-time
(class template)
(C++11)
divides tworatioobjects at compile-time
(class template)
下面是ratio_add 的源代码

00175   /// ratio_add
00176   template<typename _R1, typename _R2>
00177     struct ratio_add     //还是采用结构体的形式实现,因此他返回的类型是ratio<>
00178     {
00179     private:
00180       static constexpr intmax_t __gcd =
00181         __static_gcd<_R1::den, _R2::den>::value;
00182       static constexpr intmax_t __n = __safe_add<
00183         __safe_multiply<_R1::num, (_R2::den / __gcd)>::value,
00184         __safe_multiply<_R2::num, (_R1::den / __gcd)>::value>::value;
00185 
00186       // The new numerator may have common factors with the denominator,
00187       // but they have to also be factors of __gcd.
00188       static constexpr intmax_t __gcd2 = __static_gcd<__n, __gcd>::value;
00189       
00190     public:
00191       typedef ratio<__n / __gcd2,
00192         __safe_multiply<_R1::den / __gcd2, _R2::den / __gcd>::value> type;
00193 
00194       static constexpr intmax_t num = type::num;
00195       static constexpr intmax_t den = type::den;
00196     };
00197 
00198   template<typename _R1, typename _R2>
00199     constexpr intmax_t ratio_add<_R1, _R2>::num;
00200 
00201   template<typename _R1, typename _R2>
00202     constexpr intmax_t ratio_add<_R1, _R2>::den;
来看看这里的具体的调用。这里实现和VC2012略有不同。但是返回的都是ratio<>,因此静态成员产生的是相应的类型。
ratio_add<FiveThirds,AlsoFiveThirds>::type three;
	cout<<three.num<<"/"<<three.den<<endl;

下面看看ratio提供的关系运算

/// ratio_equal
00270  template<typename _R1, typename _R2>
00271   struct ratio_equal
00272   : integral_constant<bool, _R1::num == _R2::num && _R1::den == _R2::den>  //返回的类型是true_value or false_type
00273   { };

	ratio_equal<FiveThirds,AlsoFiveThirds>::type requal;
	cout<<boolalpha<<requal.value<<endl;   //输出false vs2012 (libstdC++是要输出true的)这里有所不同下面有具体的讲解
	cout<<ratio_equal<ratio<5,3>,ratio<5,3>>::value<<endl; //输出true

在vc2012 下面第一个输出false(?),可以看到

	// CLASS TEMPLATE ratio_equal
template<class _R1,
	class _R2>
	struct ratio_equal;

template<intmax_t _N1,
	intmax_t _D1,
	intmax_t _N2,
	intmax_t _D2>
	struct ratio_equal<ratio<_N1, _D1>, ratio<_N2, _D2> >
		: integral_constant<bool, _N1 == _N2 && _D1 == _D2>
	{	// tests if ratio == ratio
	};
它这里没有进行约分,不知道这是基于什么考虑。

但是在libstdC++里面我们可以看到

/// ratio_equal
00270   template<typename _R1, typename _R2>
00271     struct ratio_equal
00272     : integral_constant<bool, _R1::num == _R2::num && _R1::den == _R2::den>
00273     { };
可以知道这是经过约分之后进行的比较。


分享到:
评论

相关推荐

    Aspect ratio conversion

    ### Aspect Ratio Conversion 知识点详解 #### 一、什么是Aspect Ratio(纵横比) 在讨论图像、视频等媒体内容时,经常会提到“Aspect Ratio”这一概念。Aspect Ratio,中文常称为“纵横比”或“宽高比”,是指...

    Effective C++中文版

    1. 常量的定义和使用:在C++中,使用const关键字可以定义常量,例如`const double ASPECT_RATIO = 1.653;`定义了一个常量ASPECT_RATIO并初始化为1.653。这有助于确保数据的不可变性,使得一旦赋值后,值不会被修改。...

    层次分析法的C++简单代码

    计算一致性比率(Consistency Ratio, CR),如果CR小于0.1,则认为判断矩阵具有良好的一致性,可以继续后续步骤;否则,需要调整判断矩阵。 4. **计算权重向量**:对判断矩阵进行特征值计算,得到最大特征根λ_max,...

    The C++ Standard Library

    6. **实用工具库**:比如algorithm、bitset、chrono、ratio、functional、tuple、type_traits等,提供了通用的算法、位操作、时间日期处理、比例计算、函数对象和元编程工具。 7. **并发编程库**:C++11引入了线程...

    Effective C++中文版.pdf

    ### Effective C++中文版知识点概览 #### 从C转向C++ 对于许多已经熟悉C语言的程序员来说,转向C++可能会遇到一些挑战。虽然C是C++的一个子集,但两者之间存在诸多差异,这些差异使得C++拥有更加丰富的特性和更加...

    Efficient C++中文版

    《Efficient C++中文版》作为一本专注于高效使用C++的书籍,其内容覆盖了C++编程中的许多高级概念和最佳实践。以下是对该书一些核心知识点的总结和解释: 1. 预处理器指令#define 预处理器指令#define用于定义宏。...

    C++员工管理系统

    9. 实现了Master_Set_Ratio函数,用于设置奖金计算比例。 知识点 1. C++语言基础知识:这个系统使用C++语言开发,需要了解C++语言的基本语法和数据类型。 2. 文件操作:这个系统使用ifstream和ofstream类来读取和...

    c++结合opencv实现目标计数

    在本文中,我们将深入探讨如何使用C++与OpenCV库实现目标计数,特别是针对图像中的圆形商标。OpenCV(开源计算机视觉库)是一个强大的工具,广泛用于图像处理和计算机视觉任务,包括目标检测和计数。让我们逐一解析...

    高效C++:从C到C++

    ### 高效C++:从C到C++ #### 第一章:从C转向C++ **条款1:尽量用const和inline而不用#define** - **背景**:在C语言中,`#define`宏定义被广泛用于常量的定义。然而,在C++中,我们有更好的替代方案——`const`...

    Mastering the C++17 .pdf

    reading technical documentation on std::locale and std::ratio , just to find out that they aren't useful in your daily work? In this book, I'll teach you the most important features of the C++17 ...

    Effective_C++中文版.pdf

    ### Effective_C++中文版知识点概览 #### 一、从C转向C++ 对于熟悉C语言的程序员来说,转向C++可能会遇到一些挑战。虽然C是C++的一个子集,但两者之间存在诸多差异,这些差异可能导致原有的编程习惯不再适用。 **...

    C到C++

    ### C到C++:从C过渡到C++的关键知识点 #### 概述 《C到C++》这本书针对已经具备一定C语言基础的学习者,旨在帮助他们顺利过渡到C++编程。由于C++是对C语言的扩展,因此本书强调如何在保持C语言核心能力的同时,...

    vs 2019 c++20规范 S TL库中的 ratio duration<T,U> time-point<T,U>等

    vs 2019 c++20 规范 S TL库中关于时间的模板 ratio,U> , duration,U> , time_point,U>等

    c++ 实现 操作系统 作业调度算法

    4. **高响应比优先(HRN,Highest Response Ratio Next)**:结合了进程的等待时间和执行时间,以响应比(等待时间+执行时间/执行时间)为依据进行调度。这既能照顾到短进程,又避免了长进程的饥饿。 5. **优先级...

Global site tag (gtag.js) - Google Analytics