比这篇新的文章: Type_Template_Level.h
比这篇旧的文章: PnP处理函数

scientific_number.hpp

语言: C++, 标签: 无  2008/08/26发布 2个月前更新
作者: xpycc, 点击219次, 评论(0), 收藏者(0)

开关行号, 全选(Ctrl+C复制) | 一键复制:HTML, BBCode(Discuz!) , 源代码 | 查看:裸代码, 全屏
背景
主题: 字体:
C++语言: scientific_number.hpp
001 #ifndef SCIENTIFIC_NUMBER_HPP_INCLUDED
002 #define SCIENTIFIC_NUMBER_HPP_INCLUDED
003
004 #include <iostream>
005 #include <cmath>
006 #include "Type_Template_Level.h"
007 using std::istream;
008 using std::ostream;
009
010 //小演示就不套namespace了
011
012 template <int KG,int M,int S>      //单位分析
013 struct unit{
014     static const int kg=KG,m=M,s=S;
015 };
016
017 typedef unit<0,0,0> Scalar;        //标量
018
019 typedef unit<1,0,0> Mass;          //单一单位
020 typedef unit<0,1,0> Length;
021 typedef unit<0,0,1> Time;
022
023 typedef unit<0,1,-2> Acceleration; //复合单位
024 typedef unit<1,1,-2> Force;
025
026 template <class T,class U>
027 class FixNumber;                   //关联友元需要类模板的提前声明
028
029 template <class T,class U> inline
030 istream& operator>>(istream& is,FixNumber<T,U>& a){
031     return is >> a.value;
032 }
033
034 template <class T,class U> inline
035 FixNumber<T,unit<U::kg/2,U::m/2,U::s/2> >
036 sqrt(const FixNumber<T,U>& a)         //开方运算
037 {//第一次发现自己其实是能适应这种括号风格的
038     return FixNumber<T,unit<U::kg/2,U::m/2,U::s/2> >
039         ((T)sqrt(a.value));
040 }
041
042 template <class T,class U>         //T为数据类型,U为单位信息
043 class FixNumber{                   //实际操作的类
044 friend istream& operator>> <T,U>(istream&,FixNumber&);
045                        //函数的模板实参不要忘
046 friend FixNumber<T,unit<U::kg/2,U::m/2,U::s/2> > sqrt<T,U>(const FixNumber&);
047 public:
048     typedef T valuetype;
049     FixNumber(const T& val=T()):value(val)
050     {}             //T()对内置类型同样有效
051     template <class T2>
052     FixNumber(const FixNumber<T2,U>& b)
053         :value(b.get_value()) { }
054     //复制控制,如果精度损失则会得到一个Warning
055
056     const T get_value() const      //封装接口
057     { return value; }
058     void set_value(const T& val)
059     { value=val; }
060
061     template <class T2>
062     FixNumber& operator=(const FixNumber<T2,U>& b)
063     {
064         value=b.get_value();
065         //如果精度损失,则得到一个Warning
066         return *this;
067     }
068     template <class T2>
069     FixNumber <typename HigherType<T,T2>::Result,U>
070     //返回一个精度更大的FixNumble
071     operator+(const FixNumber<T2,U>& b) const
072     {
073         return FixNumber <typename HigherType<T,T2>::Result,U>
074             (value + b.get_value());
075     }
076     template <class T2>
077     FixNumber <typename HigherType<T,T2>::Result,U>
078     operator-(const FixNumber<T2,U>& b) const
079     {
080         return FixNumber <typename HigherType<T,T2>::Result,U>
081             (value - b.get_value());
082     }
083     template <class T2,class U2>
084     FixNumber<typename HigherType<T,T2>::Result,
085               unit<U::kg+U2::kg,U::m+U2::m,U::s+U2::s> >
086     operator*(const FixNumber<T2,U2>& b) const
087     {
088         return FixNumber<typename HigherType<T,T2>::Result,
089                          unit<U::kg+U2::kg,U::m+U2::m,U::s+U2::s> >
090             (value * b.get_value());
091     }
092     template <class T2,class U2>
093     FixNumber<typename HigherType<T,T2>::Result,
094               unit<U::kg-U2::kg,U::m-U2::m,U::s-U2::s> >
095     operator/(const FixNumber<T2,U2>& b) const
096     {
097         return FixNumber<typename HigherType<T,T2>::Result,
098                          unit<U::kg-U2::kg,U::m-U2::m,U::s-U2::s> >
099             (value / b.get_value());
100     }
101 private:
102     T value;   //再三考虑下,还是封装吧
103 };
104
105 template <class T,class U>
106 ostream& operator<<(ostream& os,const FixNumber<T,U>& a){
107     os << a.get_value();
108
109     //下面美化输出,打印出单位,时间关系没有写
110     switch(U::kg){
111     case 0: break;
112     case 1: os<< " kg"; break;
113     default: os<<" kg^"<<U::kg;
114     }
115     switch(U::m){
116     case 0: break;
117     case 1:
118         if (U::kg==0) os<< " m";
119         else os<<"*m";
120         break;
121     default:
122         if (U::kg==0) os<< " m^"<<U::m;
123         else os<<"*m^"<<U::m;
124     }
125     switch(U::s){
126     case 0: break;
127     case 1:
128         if (U::kg==0 && U::m==0) os<< " s";
129         else os<< "*s";
130         break;
131     default:
132         if (U::kg==0 && U::m==0) os<< " s^"<<U::s;
133         else os<< "*s^"<<U::s;
134     }
135     return os;
136 }
137
138 #endif // SCIENTIFIC_NUMBER_HPP_INCLUDED
打分:

所有评论,共0条:( 我也来说两句)


发表评论

注册登录后再发表评论