比这篇新的文章:
Type_Template_Level.h
比这篇旧的文章: PnP处理函数
作者: xpycc, 点击219次, 评论(0), 收藏者(0)
打分:
所有评论,共0条:( 我也来说两句)
比这篇旧的文章: PnP处理函数
scientific_number.hpp
语言: C++, 标签: 无 2008/08/26发布 2个月前更新作者: xpycc, 点击219次, 评论(0), 收藏者(0)
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
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条:( 我也来说两句)
代码