这是一堆我自己写完都怀疑人生的代码。
或许我见识太少了吧……
实现一个实数类。这个类也可以看作是分数类。实现了基本的四则运算和比较。另外,与整数或小数的转换还没有实现,无限循环小数转分数也暂时没有实现。但我早晚会写的。。。
咕咕咕。
这里的重头戏是模版。
啊……模版,我边学边卖,才知道模版还可以这么玩。
这次只有一个文件……
来体会一下来自C++的恐惧吧!
注意:以下代码没有经过严谨测试及性能优化。
BUGFIX:
1. 修复operator=不能对自身影响的BUG;(2018.10.10)
2.修复小数转分数时,造成整数溢出的BUG;(2018.10.10)
Rational.h
#pragma once
#include "stdinc.h"
namespace Lunacia
{
class __Rational {
};
template<typename NumT = int>
class Rational final : public __Rational
{
public:
Rational();
template<typename NumT2>
Rational(const Rational<NumT2>& ra);
Rational(NumT numer, NumT denom);
Rational(NumT numer, NumT denom, bool isDenomFixed);
~Rational();
public:
static NumT Gcd(NumT a, NumT b);
static NumT Lcm(NumT a, NumT b);
static bool IsEven(NumT num);
static NumT GetSymbol(NumT num);
static bool IsEqualFloating(long double a, long double b);
void SetDenomFixed(bool isFix);
bool GetDenomFixed() const;
void GetRationalString(std::string& __out resStr) const;
void GetRationalString(std::wstring& __out resStr) const;
public:
///operator+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
template<typename ParamT,
typename std::enable_if < std::is_integral <ParamT> ::value, ParamT > ::type * = nullptr>
Rational<NumT> operator +(const ParamT rRational) const;
template<typename ParamT,
typename std::enable_if < std::is_floating_point <ParamT> ::value, ParamT > ::type * = nullptr>
Rational<NumT> operator +(const ParamT& rRational) const;
Rational<NumT> operator +(const Rational& rRational) const;
///operator-----------------------------------------------------------------------
template<typename ParamT,
typename std::enable_if < std::is_integral <ParamT> ::value, ParamT > ::type * = nullptr>
Rational<NumT> operator -(const ParamT& rRational) const;
template<typename ParamT,
typename std::enable_if < std::is_floating_point <ParamT> ::value, ParamT > ::type * = nullptr>
Rational<NumT> operator -(const ParamT& rRational) const;
Rational<NumT> operator -(const Rational& rRational) const;
///operator******************************************************
template<typename ParamT,
typename std::enable_if < std::is_integral <ParamT> ::value, ParamT > ::type * = nullptr>
Rational<NumT> operator *(const ParamT& rRational) const;
template<typename ParamT,
typename std::enable_if < std::is_floating_point <ParamT> ::value, ParamT > ::type * = nullptr>
Rational<NumT> operator *(const ParamT& rRational) const;
Rational<NumT> operator *(const Rational& rRational) const;
///operator///////////////////////////////////////////////////////
template<typename ParamT,
typename std::enable_if < std::is_integral <ParamT> ::value, ParamT > ::type * = nullptr>
Rational<NumT> operator /(const ParamT& rRational) const;
template<typename ParamT,
typename std::enable_if < std::is_floating_point <ParamT> ::value, ParamT > ::type * = nullptr>
Rational<NumT> operator /(const ParamT& rRational) const;
Rational<NumT> operator /(const Rational& rRational) const;
///operator=======================================================
template<typename ParamT,
typename std::enable_if < std::is_integral <ParamT> ::value, ParamT > ::type * = nullptr>
Rational<NumT> operator =(const ParamT& rRational);
template<typename ParamT,
typename std::enable_if < std::is_floating_point <ParamT> ::value, ParamT > ::type * = nullptr>
Rational<NumT> operator =(const ParamT& rRational);
Rational<NumT> operator =(const Rational& rRational);
///operator== == == == == == == == == == == == == == == == == == == == == == ==
template<typename ParamT,
typename std::enable_if <
std::is_integral <ParamT> ::value ||
std::is_base_of<__Rational, ParamT>::value,
ParamT
> ::type * = nullptr>
bool operator ==(const ParamT& rRational) const;
template<typename ParamT,
typename std::enable_if < std::is_floating_point <ParamT> ::value, ParamT > ::type * = nullptr>
bool operator ==(const ParamT& rRational) const;
///operator!= != != != != != != != != != != != != != != != != != != != != != != != != != != != !=
template<typename ParamT,
typename std::enable_if <
std::is_integral <ParamT> ::value ||
std::is_floating_point <ParamT> ::value||
std::is_base_of<__Rational, ParamT>::value,
ParamT
> ::type * = nullptr>
bool operator !=(const ParamT& rRational) const;
///operator>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
template<typename ParamT,
typename std::enable_if <
std::is_integral <ParamT> ::value ||
std::is_floating_point <ParamT> ::value ||
std::is_base_of<__Rational, ParamT>::value,
ParamT
> ::type * = nullptr>
bool operator >(const ParamT& rRational) const;
///operator <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
template<typename ParamT,
typename std::enable_if <
std::is_integral <ParamT> ::value ||
std::is_floating_point <ParamT> ::value ||
std::is_base_of<__Rational, ParamT>::value,
ParamT
> ::type * = nullptr>
bool operator <(const ParamT& rRational) const ;
///operator >= >= >= >= >= >= >= >= >= >= >= >= >= >= >= >= >= >= >= >=
template<typename ParamT,
typename std::enable_if <
std::is_integral <ParamT> ::value ||
std::is_floating_point <ParamT> ::value ||
std::is_base_of<__Rational, ParamT>::value,
ParamT> ::type * = nullptr>
bool operator >=(const ParamT& rRational);
///operator <= <= <= <= <= <= <= <= <= <= <